片段事务加载空视图但片段在旋转设备后显示

时间:2014-08-31 11:58:36

标签: android navigation-drawer fragmenttransaction

我正在构建一个由谷歌文档设计的导航抽屉但是我有一个问题,即片段没有被替换。 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");
    }
}

5 个答案:

答案 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暂时查看并想要显示和构建它   对未来的看法,而不会失去其在活动中的状态。

https://stackoverflow.com/a/18979024/3329488

答案 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?所示。