Android 将ListFragment替换为带有选项卡的ViewPager内部的片段

Android 将ListFragment替换为带有选项卡的ViewPager内部的片段,android,tabs,android-viewpager,fragment,android-listfragment,Android,Tabs,Android Viewpager,Fragment,Android Listfragment,我尝试在我的应用程序中设置以下导航: 实际情况:要在列表之间滑动的ViewPager+选项卡: 列表片段A 列表片段B 所需条件: ViewPager+选项卡: ListFragment A onListItemSelected将ListFragment A替换为DetailFragment A ListFragment B onListItemSelected用DetailFragment B替换ListFragment B 目标是在选项卡导航中显示细节片段。我不能用detailFra

我尝试在我的应用程序中设置以下导航:

实际情况:要在列表之间滑动的ViewPager+选项卡:

  • 列表片段A
  • 列表片段B
所需条件: ViewPager+选项卡:

  • ListFragment A onListItemSelected将ListFragment A替换为DetailFragment A
  • ListFragment B onListItemSelected用DetailFragment B替换ListFragment B
目标是在选项卡导航中显示细节片段。我不能用detailFragment替换fragmentList(fragmentList没有自定义布局,因此没有ID,我不知道怎么做)。 此外,启动新活动会隐藏选项卡栏


有人能帮我吗?

我会制作一个知道要显示什么的包装器片段-列表或详细信息。这将与
ViewPager
完全分离-pager只知道它包含包装器片段,而这些片段将自己管理它们的内容

实施将遵循以下思路:

公共类包装器片段扩展了片段{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
MyListFragment列表=新的MyListFragment();
list.setListAdapter(适配器);
list.setOnItemClickListener(新的OnItemClickListener(){
@覆盖公共虚线单击(AdapterView l、视图v、内部位置、长id){
//根据单击的项目位置创建详细信息片段
片段细节=新片段();
getChildFragmentManager()
.beginTransaction()
.更换(R.id.容器,详细信息)
.addToBackStack(空)
.commit();
}
});
getChildFragmentManager()
.beginTransaction()
.添加(R.id.容器,列表)
.commit();
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
//“wrapper.xml”中必须有id为“container”的视图`
返回充气机。充气(右布局包装,容器,假);
}
公共类MyListFragment扩展了ListFragment{
私人监听;
公共无效setOnItemClickListener(OnItemClickListener l){
this.listener=l;
}
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
if(侦听器!=null){
listener.onItemClick(l,v,position,id);
}
}
}
}

wrapper.xml
。其思想是,
WrapperFragment
必须提供一个布局,其中包含一个id为
container
的视图,因为我们使用这个id的视图来放置子片段-
MyListFragment
DetailsFragment



另一种方式。这应该行得通,但您必须尝试一下(布局本身有
id
,而不是有一个id
container
的孩子):



布局包装器会像这样吗?我得到onCreateView的一个膨胀异常。添加了
wrapper.xml
的示例。如果此
getChildFragmentManager().popBackStack()
有问题,请告诉我。当显示
详细信息片段时,请注意
.addToBackStack(null)
行。它基本上是说“将此事务保存为历史操作-通过按HW back按钮可以将其向后移动”。和
popbackbackstack()
有点类似于HW后退按钮单击。通过将其视为类似于HTML5历史API,可能更容易理解
backStack
管理。首先,感谢这一点,它解决了我在过去几天遇到的一个问题,其次,关于backStack的内容,我发现从getChildFragmentManager()更改为常规FragmentManager()从support.app启用“后退”按钮,无需从任何地方使用childmanager手动呼叫即可工作。不确定这会有什么副作用,但其所有行为都符合我的要求:D@Kevin,抱歉,未收到您的评论。原因可能是
onCreateOptionsMenu()
仅在顶级片段包装器上调用。解决方案可以是从那里创建菜单-例如,手动调用
listFragment\onCreateOptions菜单()
。这是从头开始的,你需要试试这个