我正在构建一个由谷歌文档设计的导航抽屉但是我有一个问题,即片段没有被替换。 http://developer.android.com/training/implementing-navigation/nav-drawer.html
首次加载应用时,会加载默认片段。 单击抽屉列表上的另一个项目会留下空视图 但是,在旋转设备时,会加载所选的片段。
public void selectNavActivty(int position){
// TODO Changing between the different screens selection
fragment = null;
switch (position) {
case 0:
fragment = OverLay.newInstance();
break;
case 1:
fragment = Dummy.newInstance();
break;
}
if(fragment != null) {
// attach added to handle viewpager fragments
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.content_frame, fragment).attach(fragment)
.addToBackStack(null);
trans.commit();
getFragmentManager().executePendingTransactions();
} else {
Log.d("Drawer Activity","Error in creating Fragment");
}
}
答案 0 :(得分:5)
对于导航菜单片段事务,我使用以下方法,这样片段将被添加并放在顶部。
String name = "myFragment";
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment, name)
.commit();
查找attach()函数。它遵循不同的片段生命周期。 还要确保您的布局文件framelayout可见。
答案 1 :(得分:0)
修改您的代码如下:
if(fragment != null) {
// attach added to handle viewpager fragments
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.content_frame, fragment);
trans.addToBackStack(null);
trans.commit();
} else {
Log.d("Drawer Activity","Error in creating Fragment");
}
如果解决方案不适合您,请与您的片段代码共享xml代码。
答案 2 :(得分:0)
添加片段后,它将被添加到活动状态及其视图中 将添加到已定义的Container视图中。但通过附加什么都不会 如果片段尚未添加到UI,则显示。它只是附加 片段管理器。但是,如果视图已添加到容器中 在UI和分离之后,通过附加它将再次显示 在它的容器中。最后,如果您愿意,可以使用附加和分离 destroy fragment暂时查看并想要显示和构建它 对未来的看法,而不会失去其在活动中的状态。
答案 3 :(得分:0)
我的解决方案是在片段替换时标记具有唯一标记的所有片段。 确保在创建期间为默认片段分配唯一标记。更有效的方法是在重新创建相同的片段之前识别片段。
public void selectNavActivty(int position){
// TODO Changing between the different screens selection
FragmentManager fragmentManager = getSupportFragmentManager();
fragment = fragmentManager.findFragmentById(R.id.content_frame);
String fragmentTag = null;
switch (position) {
case 0:
fragmentTag = "case0Tag"; // please change to better tag name
break;
case 1:
fragmentTag = "case1Tag"; // please change to better tag name
break;
default:
Log.d("Drawer Activity","Error in creating Fragment");
return;
}
if (fragmentTag != null && !fragment.getTag().equals(fragmentTag))
fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit();
}
答案 4 :(得分:0)
在我的情况下,旋转设备后显示空白片段。我了解到,在Activity.onCreate()
中,我总是要求创建一个空白Fragment
,此后需要一个空白。所以我将其行为更改为:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
openEmptyFragment()
openAnotherFragment()
}
}
我建议先检查savedInstanceState != null
,然后再添加新的片段,如Why won't Fragment retain state when screen is rotated?所示。