我的主要活动是操作栏中带有选项卡的滑动视图,可用于直接更改为特定片段。我基本上遵循了developer guidelines。到目前为止,这工作正常并且符合预期。
但是,我现在在菜单中有几个项目(设置,关于),这些项目不应该作为ViewPager的一部分显示,而是应该完全替换ViewPager并在动作中设置“向上导航”功能酒吧。跟着这个question的答案我知道如何使用BackStack来操作操作栏并显示“导航”功能。
但是我不确定更换ViewPager的最佳方法是什么。据我所知,我可以尝试禁用所有ViewPager功能并使其显示为单个片段(例如禁用选项卡和滑动),或者我可以使用嵌套片段。然而,我不相信这两种选择都是“干净的”。
也许我在这里忽略了一些东西,并且有更直观的方法来实现同样的目标?你们有什么想法呢?你们如何实现“基本”的东西呢?
P.S。:显然我可以为此使用活动,但我认为活动对于简单的“关于”文本来说太重了,而且在我的理解中,应该尽可能地尝试使用碎片。
答案 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>
这给了我这个输出:
注意:我使用的是红色背景,但您可以尝试使用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,那些事务将以自然方式对后退按钮作出反应。