android-fragments 如何在后台堆栈中找到片段并在Android中显示它

flvlnr44  于 2022-11-13  发布在  Android
关注(0)|答案(5)|浏览(119)

我有一个Activity,在这里我依次加载了3fragments

  • FragmentA
  • FragmentB
  • FragmentC

流是这样的我已经使用添加片段一个在另一个之上

开始-----〉* 加载 * FragmentA----〉* 加载 * FragmentB----〉加载FragmentC

* 我现在要做的是 *

现在假设FragmentC是显示的顶部片段
我想从堆栈中找到FragmentA并显示它,而不是重新创建fragmentA

  • 我用来添加fragmentA的代码是例如:*
Fragment fragment = null;
            FragmentTransaction fragmentTransaction = null;
            fragment = new FragmentA();
            fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.addToBackStack(FragmentA.class.getSimpleName());
            fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
            fragmentTransaction.add(R.id.container, fragment, FragmentA.class.getSimpleName());

            if(fragment!=null && fragmentTransaction!=null){
                fragmentTransaction.commitAllowingStateLoss();
            }
luaexgnf

luaexgnf1#

看看FragmentManager.getBackStackEntryAt方法,从那里你可以回到你历史的任何片段...

eanckbw9

eanckbw92#

循环返回堆栈条目,同时,如果你发现任何通过id或标签匹配的片段,只要弹出包含片段A的名称/标签的返回堆栈,这样片段A就被显示出来,而不是再次添加。

0ejtzxu1

0ejtzxu13#

按Tag检索片段的示例代码如下所示

FragmentA frA = getSupportFragmentManager().findFragmentByTag(FragmentA.class.getSimpleName());

如果它不为null,则可以在容器中重用它

if(frA != null) {
   FragmentTransaction fragmentTransaction = getSupportFragmentManager.beginTransaction();
   fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
   //you could add this transactionn to backstack again here if you want to be able to pop it later
   fragmentTransaction.add(R.id.container, frA, FragmentA.class.getSimpleName());
} else {
   //if your fragment is null as it was destroyed previously you can create a new one here
}
mv1qrgav

mv1qrgav4#

您正在为事务提供标记fragmentTransaction.addToBackStack(FragmentA.class.getSimpleName());,您可以使用相同的标记在回栈中查找片段,在创建新片段之前,使用片段管理器上的findFragmentByTag检查回栈中的片段,如果存在,则该方法返回片段,否则为空

ufj5ltwl

ufj5ltwl5#

试试看!

val fm: FragmentManager? = fragmentManager

                    for (entry in 0 until fm.getBackStackEntryCount()) {
                        Log.i(TAG, "Found fragment: " + fm.getBackStackEntryAt(entry).getId())
                    }

相关问题