替换事务后,将嵌套片段重复使用

时间:2019-07-19 12:38:40

标签: java android

我有mainFrag,它有2个标签(没有ViewPager)和容器布局,其中显示了2个片段frag1frag2

该应用正在使用替换交易,mainFrag也添加到了backstackmainFrag使用childFragmentManager来替换片段。

问题frag1frag2 使用backstack并在每次调用onCreate时重新创建并从REST请求加载数据的问题

在这种情况下(使用单个Activity),如何可能在没有开销的情况下解决该问题?也许是一些好的做法?

enter image description here

2 个答案:

答案 0 :(得分:2)

否,您无法在replace之后恢复片段状态。 来自Official documentation

  

FragmentTransaction replace (int containerViewId, Fragment fragment, String tag)

     

替换添加到容器中的现有片段。这与调用remove(Fragment)来调用所有当前添加的,使用相同containerViewId然后使用此处给出的相同参数的add(int, Fragment, String)片段相同。

如果要保留片段状态,可以尝试hide(Fragment)show(Fragment)

编辑

如果您想通过onBackPressed()浏览它们,则应创建自己的后堆栈数组

例如:

第一个片段:

class Fragment1 : Fragment() {
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment1_view, container, false)
        }

        companion object {
            fun newInstance() = Fragment1()
        }
    }

第二个片段:

class Fragment2 : Fragment() {
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.fragment2_view, container, false)
        }

        companion object {
            fun newInstance() = Fragment2()
        }
    }

活动:

class MainActivity : AppCompatActivity() {
    private val backStack = mutableListOf<String>()
    private val fragment1:Fragment1 = Fragment1.newInstance()
    private val fragment2:Fragment2 = Fragment2.newInstance()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager.beginTransaction()
            .add(R.id.container, fragment1, "Fragment1")
            .add(R.id.container, fragment2, "Fragment2")
            .commit()
        backStack.add("Fragment1")
        backStack.add("Fragment2")
    }

    fun showFragment1() {
        if (backStack.last() == "Fragment1") return
        supportFragmentManager.beginTransaction()
            .hide(fragment2)
            .show(fragment1)
            .commit()
        backStack.add("Fragment1")
    }

    fun showFragment2() {
        if (backStack.last() == "Fragment2") return
        supportFragmentManager.beginTransaction()
            .hide(fragment1)
            .show(fragment2)
            .commit()
        backStack.add("Fragment1")
    }

    override fun onBackPressed() {
        if (backStack.size < 2) super.onBackPressed()
        val last = backStack.removeAt(backStack.size - 1)
        if (last == "Fragment1") {
            supportFragmentManager.beginTransaction()
                .hide(fragment1)
                .show(fragment2)
                .commit()
        } else {
            supportFragmentManager.beginTransaction()
                .hide(fragment2)
                .show(fragment1)
                .commit()
        }
    }

}

More关于hide()

More关于show()

答案 1 :(得分:2)

根据the Fragments documentation,您应该使用addToBackStack()replace()操作将片段B添加到后堆栈中。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

执行此操作时,FragmentManager会为您处理onBackPressed(),反转replace()操作并还原先前的Fragment,还原其保存的实例状态,视图状态等。

相关问题