Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android在提交事务后立即调用findFragmentByTag_Android_Android Fragments_Fragmenttransaction - Fatal编程技术网

android在提交事务后立即调用findFragmentByTag

android在提交事务后立即调用findFragmentByTag,android,android-fragments,fragmenttransaction,Android,Android Fragments,Fragmenttransaction,用另一个片段替换片段的常见做法是: getActivity().getSupportFragmentManager() .beginTransaction() .setReorderingAllowed(true) .replace(R.id.fragment_holder, ItemFragment.newInstance(bundle),"tag") .addToBackStack(null) .commit(); commit()方法的文档说明: 安排此事务的提交提交

用另一个片段替换片段的常见做法是:

getActivity().getSupportFragmentManager()
.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.fragment_holder, ItemFragment.newInstance(bundle),"tag")
.addToBackStack(null)
.commit();
commit()
方法的文档说明:

安排此事务的提交提交不会立即发生;它将被安排为下一次线程准备就绪时在主线程上完成的工作


现在假设我调用
getActivity.getSupportFragmentManager.findFragmentByTag(“tag”)就在上面提到的提交方法之后。由于提交不会立即发生,它是否可能返回null?

我想说这是可能的,但是我觉得这里真正的问题是您使用的设计。如果片段A需要引入/替换片段B,那么正确的设计是让活动处理片段管理。片段不应直接添加/替换其他片段

如果这些都是在活动中处理的,您可以轻松地保留对新片段的引用,这意味着您不需要查找FragmentByTag(“标记”),因为您在创建/替换时已经有了对它的引用

           Activity
           /      \
   Fragment A     Fragment B
片段A和片段B不应直接相互影响

// In Activity ...
public replaceFragment() {
   Fragment fragmentB = ItemFragment.newInstance(bundle);
    
    getSupportFragmentManager()
       .beginTransaction()
       .setReorderingAllowed(true)
       .replace(R.id.fragment_holder, fragmentB, "tag")
       .addToBackStack(null)
       .commit();

    // You now have fragmentB no need to getSupportFragmentManager.findFragmentByTag("tag")
    fragmentB.doSomething();

如果
findFragmentByTag(“tag”)
会声明这种情况,我认为它不会返回null

另外,该方法来自
FragmentManager
类,因此它只关心片段管理器中是否包含
commit()
函数来自
FragmentTransaction
a类片段即使未提交也可以在片段管理器的后堆栈中,因此,函数
findFragmentByTag(“tag”)
将返回片段,并且仅当带有该标记的片段从未添加到片段管理器时才会返回null

getSupportFragmentManager()
   .beginTransaction()
   .setReorderingAllowed(true)
   .replace(R.id.fragment_holder, fragmentB, "tag")
   .addToBackStack(null)

上面的代码将片段添加到宿主活动的片段管理器的后堆栈中。您可以这样做,并在片段管理器中找到此片段,不需要提交。

当然,我可以保留对新创建片段的引用,但我希望避免它。片段已经由系统管理和保存(SupportFragmentManager),因此对它们进行强引用是浪费内存。更新:我测试了越来越多的片段,最终可能会遇到
nullPointerException
。所以我的问题的简单答案是:是的,这是可能的!