无法显示已添加的片段

时间:2018-06-08 07:43:18

标签: android android-fragments kotlin

我试图执行以下操作:

  1. 启动应用 - 片段A加载
  2. 点击A - 片段B加载
  3. 上的按钮
  4. 点击B上的按钮 - 片段A加载
  5. 这是MainActivity中的一种方法:

    private fun addBrowseBooksFragment() {
    
            var browseBooksFragment = BrowseBooksFragment()
            val fragmentManager = fragmentManager
            val fragmentTransaction = fragmentManager.beginTransaction()
    
            if ((fragmentManager.findFragmentByTag("BrowseBooksFragment")) != null){
                browseBooksFragment = fragmentManager.findFragmentByTag("BrowseBooksFragment") as BrowseBooksFragment
    
                println("working fine up to here")
    
                if (browseBooksFragment.isAdded) {
                    println("Showing Added Fragment")
                    browseBooksFragment.setCallBackInterface(this)
                    fragmentTransaction.show(browseBooksFragment)
                }
    
            } else {
                browseBooksFragment.setCallBackInterface(this)
                fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment")
            }
            fragmentTransaction.commit()
        }
    

    else工作正常,因为片段A加载没有问题。片段B也可以毫无问题地加载。但是当我单击按钮返回到片段A时,browseBooksFragment.isAdded返回false,但browseBooksFragment不为空。它按标签返回片段。

    我试图避免通过不使用replace来重新创建整个片段,而是使用show

    我应该补充一点,如果我注释掉isAdded条件并将show更改为replace,我会收到片段已添加例外。

    //            if (browseBooksFragment.isAdded) {
                    println("Showing Added Fragment")
                    browseBooksFragment.setCallBackInterface(this)
                    fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment")
    //                fragmentTransaction.show(browseBooksFragment)
    //            }
    

    如何正确显示已添加的片段A?

1 个答案:

答案 0 :(得分:3)

而不是replace(),您应该使用add()。这样您就不会替换现有的片段,而是将片段B推送到片段A的顶部。

对于前。

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
   .add("id of your fragment container", fragment, fragment.class.getSimpleName())
   .addToBackStack(fragment.class.getSimpleName())
   .commit();

这样,如果你想加载以前的片段,你只需要做

fm.popBackStack();

这将从BackStack弹出片段B,显示先前创建的片段A.