Android 使用FragmentTransaction.attach()和detach()时不保留片段ui
根据我对文档的理解,您可以分离一个片段,稍后再重新连接它,它将自动与分离时的外观相同。还有别的吗?我有一个简单的动作栏,有两个按钮,分别对应两个不同的片段。当我从第一个片段切换到第二个片段再切换到第一个片段时,第一个片段中加载的图像将不再可见。我是否错误地使用了“附加/分离”,或者我是否需要自己管理instanceState并重新绘制ui。如果是,附加和分离方法有什么意义Android 使用FragmentTransaction.attach()和detach()时不保留片段ui,android,android-fragments,detach,Android,Android Fragments,Detach,根据我对文档的理解,您可以分离一个片段,稍后再重新连接它,它将自动与分离时的外观相同。还有别的吗?我有一个简单的动作栏,有两个按钮,分别对应两个不同的片段。当我从第一个片段切换到第二个片段再切换到第一个片段时,第一个片段中加载的图像将不再可见。我是否错误地使用了“附加/分离”,或者我是否需要自己管理instanceState并重新绘制ui。如果是,附加和分离方法有什么意义 @Override public void onStart(){ super.onStart();
@Override
public void onStart(){
super.onStart();
ndi=new NasaDailyFragment(this);
bnf=new BreakingNewsFragment(this);
ft=getFragmentManager().beginTransaction();
ft.add(R.id.focused_view_container,ndi).commit();
}
public void onTabSelected(Tab tab, FragmentTransaction f) {
switch(tab.getPosition()){
case 0:
ft=getFragmentManager().beginTransaction();
if(!ndi.isAdded()){
ft.replace(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();
ft.attach(ndi);
getFragmentManager().executePendingTransactions();
}
break;
case 1:
ft=getFragmentManager().beginTransaction();
ft.detach(ndi);
ft.replace(R.id.focused_view_container, bnf).commit();
getFragmentManager().executePendingTransactions();
break;
}
}默认情况下,分离并附加
片段时会重新创建该片段。您可以通过调用片段上的setRetainInstance(true)
来更改此行为:实际实例将保留在内存中,并且在分离连接周期后不会重新创建。但是片段
的UI会以两种方式被破坏,然后重新创建,因此您需要确保在将片段
重新附加到活动
后,用适当的数据填充视图。希望这有帮助。使用显示和隐藏,而不是附加和分离。这是一个示例代码
private class MyTabListener implements ActionBar.TabListener {
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
switch (tab.getPosition()) {
case 0:
if (frag1 == null) {
// If not, instantiate and add it to the activity
frag1 = Fragment.instantiate(getApplicationContext(),
FeedsActivity.class.getName());
ft.add(android.R.id.content, frag1, "Feeds");
} else {
// If it exists, simply attach it in order to show it
ft.show(frag1);
}
return;
case 1:
if (frag2 == null) {
// If not, instantiate and add it to the activity
frag2 = Fragment.instantiate(getApplicationContext(),
ProfileActivity.class.getName());
ft.add(android.R.id.content, frag2, "Profile");
} else {
// If it exists, simply attach it in order to show it
ft.show(frag2);
}
return;
case 2:
if (frag3 == null) {
// If not, instantiate and add it to the activity
frag3 = Fragment.instantiate(getApplicationContext(),
History.class.getName());
ft.add(android.R.id.content, frag3, "History");
} else {
// If it exists, simply attach it in order to show it
ft.show(frag3);
}
return;
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
if (frag1 != null) {
// Detach the fragment, because another one is being attached
switch (tab.getPosition()) {
case 0:
ft.hide(frag1);
return;
case 1:
ft.hide(frag2);
return;
case 2:
ft.hide(frag3);
return;
}
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
您的逻辑有问题-您替换片段,然后再次附加它,或者在案例1中分离,然后替换,这是多余的。除此之外,每次切换选项卡时,您都会销毁旧片段。
我宁愿走这条路:
public void onTabSelected(Tab tab, FragmentTransaction f) {
switch(tab.getPosition()){
case 0:
if(ndi.isAdded()){
f.detach(bnf);
f.attach(ndi);
}else{
f.add(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
}
break;
case 1:
if(bnf.isAdded()){
f.detach(ndi);
f.attach(bnf);
}else{
f.add(R.id.focused_view_container, bnf).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
}
break;
}
并且您不必在传递的FragmentTransaction OnAbsElected事件上调用commit。错误,方法正在执行其他操作things@kreker,“控制是否在活动重新创建过程中保留片段实例”-意义是否不同?是的,问题是关于attach-detach之间的片段状态,没有跨活动重新创建没有回答这个问题,附加和分离是为了什么?@basimsher如果这对我不起作用。我正在使用ActionBarSherlock。@Basimherif你指的是什么?@Basimherif,不正确-在分离/附加时,碎片没有被销毁,只是在移除或替换时,这就是分离/附加的全部要点。