【问题标题】:How to convert Fragment/ViewPager Tabs to Full Screen如何将 Fragment/ViewPager 选项卡转换为全屏
【发布时间】:2012-11-26 21:35:46
【问题描述】:

基本上,我要问的内容与打开屏幕上的 Twitter 应用程序 Plume 中的功能相同。在小屏幕(手机)上,您可以来回滑动三个选项卡。我有这个确切的设置。在平板电脑上它看起来很糟糕,因为有太多的空白。在 Plume 中,他们只是在屏幕上加载了所有三个选项卡——没有滑动,它们都显示出来,每个都占据屏幕的 1/3。更好地利用空间。你是怎么做到的?

这是我的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_layout);

    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setOffscreenPageLimit(3);

    mViewPager
            .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);

                }
            });

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }

    catName = getSharedPreferences("catName", Context.MODE_PRIVATE);
    itemName = getSharedPreferences("itemName", Context.MODE_PRIVATE);

    mViewPager.setCurrentItem(1);

}

public void onTabUnselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

}

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    mViewPager.setCurrentItem(tab.getPosition());
}

public void onTabReselected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment f = null;
        switch (position) {
        case 0: {
            f = new MasterFrag();
            Bundle args = new Bundle();

            f.setArguments(args);
            break;
        }
        case 1: {
            f = new FeaturedFrag();
            Bundle args = new Bundle();

            f.setArguments(args);
            break;
        }

        case 2: {
            f = new TopFrag();
            Bundle args = new Bundle();

            f.setArguments(args);
            break;
        }

        default:
            throw new IllegalArgumentException("not this many fragments: "
                    + position);
        }

        return f;

    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
        case 0:
            return getString(R.string.mastercattab1).toUpperCase(Locale.ENGLISH);
        case 1:
            return getString(R.string.mastercattab2).toUpperCase(Locale.ENGLISH);
        case 2:
            return getString(R.string.mastercattab3).toUpperCase(Locale.ENGLISH);

        }
        return null;
    }
}

这是我的 XML 片段布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >


            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="0"
                android:orientation="horizontal" />

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewpager"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1" />
        </LinearLayout>
    </TabHost>

</LinearLayout>

【问题讨论】:

  • 对不同尺寸使用不同的布局developer.android.com/guide/practices/tablets-and-handsets.html ... 对于平板电脑布局应该包含 3 个用于手机视图分页器的占位符/片段... 然后在 onCreate of Activity 中,您应该检查哪个视图退出分页器或片段和基于此设置活动为标签或手机正确...
  • 我已编辑添加我自己的 XML 布局。另外,我这样做的方式是:一个带有三个内部 ListFragment 的 FragmentActivity。在每个 ListFragment 中都有一个 onActivityCreate,其中加载了不同的 XML 文件。我假设您在谈论主要片段活动的 onCreate ?这种方法兼容吗?
  • 这一切都在“创建单窗格和多窗格布局”中...如果您使用支持库,它应该是兼容的...您应该只担心 ActionBar 的东西(对不起,我现在在 Android 上,很难提供更准确的答案)
  • @Luksprog 我现在甚至不应该使用兼容性库。我的目标是 Androind 4.0+(在早期我打算让它向后兼容)。但它有效吗?
  • @Luksprog 我没有因此而崩溃。由于我不是针对旧的 SDK 版本,我应该只转储支持库(和所有引用)吗?这会提高性能/稳定性吗?

标签: android android-fragments android-tabs


【解决方案1】:

有了你最近的答案和一个有效的 xml 布局加上下面的代码,我认为它看起来很简单! :)

编辑:所以想法是您有两种 XML 布局,一种用于中小型屏幕(您的第一篇文章中的 xml),另一种用于平板电脑、大型和 xlarge(您的工作答案中的 xml)。

理论上你可以像这样在两者之间切换:

public class YourClassName extends FragmentActivity {

    static boolean isTablet = false;
    static ActionBar actionBar = null;

public void onCreate(Bundle savedInstanceState) {
    actionBar = getActionBar();

    if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) {     
        setContentView(R.layout.single_pane_fragment_layout);
        isTablet = true;
    } else {
        setContentView(R.layout.viewpager_fragment_layout);
    }
...

然后您可以尝试在片段活动中的 onTabSelected 中调用以下代码,但您可能希望在 onCreateView 下的片段中调用它。请注意,我将变量设为静态。

例子:

if (YourClassName.actionBar != null && YourClassName.actionBar.isShowing() && YourClassName.isTablet) {
    YourClassName.actionBar.removeAllTabs();
}

这里还有关于 ActionBar.hide() 和 .removeAllTabs() 的更多信息: http://developer.android.com/reference/android/app/ActionBar.html#hide%28%29

【讨论】:

  • 如何以编程方式执行此操作?在 XML 中,我可以定义布局,但在 Java 中不行?
  • 再次感谢!直到今晚晚些时候我才能尝试这个,但是我注意到这个解决方案的一件事。我不想隐藏整个操作栏,我仍然需要它。只是附在它上面的标签。也许这更像是一个 ViewPager 问题?我不知道?也许我需要像您使用的方法一样禁用它?
  • 尝试使用 ActionBar 的 .removeAllTabs() 常量,然后编辑上面的帖子。
  • 嘿,明白了!谢谢。我不得不使用您的代码的变体,但效果很好......
【解决方案2】:

我只是以谷歌网站上的这段代码为例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/frags">
    <!-- "Fragment A" -->
  <fragment class="com.example.android.TitlesFragment"
            android:id="@+id/list_frag"
            android:layout_width="@dimen/titles_size"
            android:layout_height="match_parent"/>
    <!-- "Fragment B" -->
  <fragment class="com.example.android.DetailsFragment"
            android:id="@+id/details_frag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

然后我必须在两个片段上方添加ViewPager

【讨论】:

  • 另一种选择可能是只使用全屏自定义对话框片段。
  • 我还没有为此奖励 50 分。如果您将此作为答案与示例一起列出,我会奖励您,因为看起来没人会得到它。
  • 我这样做的方式是在小屏幕上使用标签/viewpager。通过上面的方法,我成功地更好地利用了平板电脑屏幕上的空间。但是,在更大的屏幕上,我仍然在操作栏中有无用的选项卡,它们什么都不做。如果这也是你能指出的,我会很高兴的!
  • 哦,抱歉,我们对此进行了更深入的研究,CDF 在这里无济于事……让我再考虑一下。
  • 尝试调用actionBar.hide();隐藏栏。 ;) 当然还有 actionBar.show() 再次显示它;
猜你喜欢
  • 2013-02-25
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多