android - 从容器中移除 fragment 后,Fragment.isAdded 返回 true

标签 android android-fragments

我有一个布局如下的 Activity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/frameLayoutA"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_weight="1" >
    </FrameLayout>
    <FrameLayout
        android:id="@+id/frameLayoutB"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_weight="1" >
    </FrameLayout>
</LinearLayout>

在activity的onCreate中,我在frameLayoutA中加载了Fragment_A,在frameLayoutB中加载了Fragment_B。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    fmA=(FrameLayout) findViewById(R.id.frameLayoutA);
    fmB=(FrameLayout) findViewById(R.id.frameLayoutB);

    fragA=new FragmentA();
    fragB=new FragmentB();
    fragC=new FragmentC();
    addFragmentsInActivity(R.id.frameLayoutA,fragA);
    addFragmentsInActivity(R.id.frameLayoutB,fragB);
}

public void addFragmentsInActivity(int id, Fragment fragment)
{
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(id, fragment);
    fragmentTransaction.commit();
}

我想使用菜单操作在 frameLayoutA 中加载 Fragment_B,在 frameLayoutB 中加载 Fragment_C。菜单操作为:

    removeFragmentsInActivity(R.id.frameLayoutB,fragB);
    addFragmentsInActivity(R.id.frameLayoutB,fragC);
    if(!fragB.isAdded()){
            Log.e("check", "fragB already removed from frameLayoutB");
        removeFragmentsInActivity(R.id.frameLayoutB,fragB);
        addFragmentsInActivity(R.id.frameLayoutA,fragB);
    }
    else{
        Log.e("check", "fragB already added");
    }    

    public void removeFragmentsInActivity(int id, Fragment fragment)
    {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(fragment);
        fragmentTransaction.commit();
    }

Fragment_B 没有显示在 frameLayoutA 中。 frameLayoutA 显示 Fragment_A。再次单击菜单操作时,将加载 Fragment_B。

调试发现在fragB.remove()操作完成后fragB.isAdded()返回true。在第二个菜单操作期间,fragB.isAdded() 返回 false 并执行 fragB.add() 并且 FragmentB 显示在 frameLayoutA 中。

我理解提交是一个异步操作。 isAdded 返回 true,因为提交是异步的,并且直到调用 fragB.isAdded() 时才完成删除操作提交。是真的吗?

请提出解决问题的可能解决方案或方法。

问候, 维宝

最佳答案

是的,事务是异步提交的。如果您想在执行 isAdded 之前确保所有交易都已完成,请运行:

getFragmentManager().executePendingTransactions();

来自 executePendingTransactions() 的文档:

After a FragmentTransaction is committed with FragmentTransaction.commit(), it is scheduled to be executed asynchronously on the process's main thread. If you want to immediately executing any such pending operations, you can call this function (only from the main thread) to do so. Note that all callbacks and other related behavior will be done from within this call, so be careful about where this is called from.

所以你的代码应该是这样的:

removeFragmentsInActivity(R.id.frameLayoutB,fragB);
addFragmentsInActivity(R.id.frameLayoutB,fragC);
getFragmentManager().executePendingTransactions();
if(!fragB.isAdded()){
        Log.e("check", "fragB already removed from frameLayoutB");
    removeFragmentsInActivity(R.id.frameLayoutA,fragA);
    addFragmentsInActivity(R.id.frameLayoutA,fragB);
}
else{
    Log.e("check", "fragB already added");
}

注意还修复了 fragment A 的删除。

关于android - 从容器中移除 fragment 后,Fragment.isAdded 返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10715008/

相关文章:

android - 如何使用在 fragment 之间设置动画的共享元素过渡

android - WebView 嵌入视频始终在视频周围有白色边框

Android Fragment 返回不起作用,setDisplayHomeAsUpEnabled(true)setHomeButtonEnabled(true);

android - 膨胀类 fragment 时出错 | fragment 没有创建 View

java - 如何在 fragment 中使用 ViewModel?

java - ViewPager 中替换 fragment 的问题

android - ListFragment 与 ListActivity - 使用哪一个?

android - 如何重构一个包含很多监听器内部类的类?

android - 设计布局以支持多屏幕

Android:Spinner 没有正确获得焦点