用另一个片段替换ViewPager

时间:2014-05-02 18:31:28

标签: android android-fragments replace android-viewpager android-nested-fragment

我的主要活动是操作栏中带有选项卡的滑动视图,可用于直接更改为特定片段。我基本上遵循了developer guidelines。到目前为止,这工作正常并且符合预期。

但是,我现在在菜单中有几个项目(设置,关于),这些项目不应该作为ViewPager的一部分显示,而是应该完全替换ViewPager并在动作中设置“向上导航”功能酒吧。跟着这个question的答案我知道如何使用BackStack来操作操作栏并显示“导航”功能。

但是我不确定更换ViewPager的最佳方法是什么。据我所知,我可以尝试禁用所有ViewPager功能并使其显示为单个片段(例如禁用选项卡和滑动),或者我可以使用嵌套片段。然而,我不相信这两种选择都是“干净的”。

也许我在这里忽略了一些东西,并且有更直观的方法来实现同样的目标?你们有什么想法呢?你们如何实现“基本”的东西呢?

P.S。:显然我可以为此使用活动,但我认为活动对于简单的“关于”文本来说太重了,而且在我的理解中,应该尽可能地尝试使用碎片。

2 个答案:

答案 0 :(得分:3)

根据我的理解,您可以将ViewPager作为FrameLayout放在父级中,将add()放在ViewPager上方的addToBackState()方法中。 /> 您将避免禁用或刷新ViewPager。只需在其上方添加一个新片段。


更新

我可以使用add()方法和添加的片段上的自定义background来实现它,以避免重叠问题。最后制作此背景clickable以防止ViewPager背后的点击事件 查看我的活动布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.viewpageroverlap.MainActivity"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

我的菜单项事件:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        getSupportFragmentManager().beginTransaction()
            .add(R.id.container, OverlapFragment.newInstance(990), null).addToBackStack(null).commit();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

我的重叠片段布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.viewpageroverlap.MainActivity$OverlapFragment"
    android:background="#FF0000"
    android:clickable="true" >

    <TextView
        android:id="@+id/section_label"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" />

</RelativeLayout>  

这给了我这个输出:

Screenshot Viewpager Overlaped by Fragment

注意:我使用的是红色背景,但您可以尝试使用Android资源颜色,并避免将文件中声明的颜色用作android:background="@android:color/white"

WITH TABS

您可以执行与上述相同操作,并使用NAVIGATION_MODE_STANDARD重置导航:

if (id == R.id.action_settings) {
    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    getSupportFragmentManager().beginTransaction()
        .add(R.id.container, OverlapFragment.newInstance(990), null).addToBackStack(null).commit();
    return true;
}  

然后,当用户返回ViewPager时(当他按下主页按钮或硬件后退按钮时),将旧导航重置为:

// do the same with android.R.id.home inside onOptionsItemSelected
@Override
public void onBackPressed() {
    // check if the "about" fragment is still displayed
    if(this.getSupportFragmentManager().getBackStackEntryCount() > 0) {
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        this.getSupportFragmentManager().popBackStack();
    }
}

答案 1 :(得分:0)

只需将ViewPager放在自己的片段中,并在想要使用常规片段事务更改为另一个片段时替换它。

如果启用addToBackStack,那些事务将以自然方式对后退按钮作出反应。