vib*_*hor 10 android android-fragments
我有一个以下布局的活动
<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>
Run Code Online (Sandbox Code Playgroud)
在onCreate of activity中,我在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();
}
Run Code Online (Sandbox Code Playgroud)
使用菜单操作我想在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();
}
Run Code Online (Sandbox Code Playgroud)
Fragment_B未显示在frameLayoutA中.frameLayoutA显示Fragment_A.再次单击"菜单"操作时,将加载Fragment_B.
调试我发现,在fragB.remove()操作完成后,fragB.isAdded()返回true.在第二个菜单操作期间,fragB.isAdded()返回false并执行fragB.add()并在frameLayoutA中显示FragmentB.
我知道commit是一个异步操作.isAdded返回true,因为commit是异步的,并且直到调用fragB.isAdded()时才执行remove操作提交.这是真的吗?
请建议可能的解决方案或方法来解决问题.
此致,Vibhor
Paw*_*ski 26
是的,事务是异步提交的.如果要在执行前确保所有trasactions都已完成isAdded,请运行:
getFragmentManager().executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)
从文档executePendingTransactions():
使用FragmentTransaction.commit()提交FragmentTransaction后,它将被安排在进程的主线程上异步执行.如果要立即执行任何此类挂起操作,可以调用此函数(仅从主线程)来执行此操作.请注意,所有回调和其他相关行为都将在此调用中完成,因此请注意调用它的位置.
所以你的代码应该是这样的:
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");
}
Run Code Online (Sandbox Code Playgroud)
注意还修复了片段A的删除.
| 归档时间: |
|
| 查看次数: |
19838 次 |
| 最近记录: |