首先,谢谢你看这个。 我有4个碎片。一个是显示菜单的菜单片段。我有2个列表片段,显示数据和图片列表。第四个片段是一个细节片段。 一切都很正常。
设定:
我点击它显示的列表按钮,菜单片段隐藏在它后面。
我单击列表片段中的一个条目,它使用一个接口传递数据并显示详细信息片段。
一旦它将我带到列表片段,我就会单击后退按钮。
我再次单击后退按钮,它显示菜单碎片就像它应该的那样。
问题:
如果我再次单击列表按钮,列表会显示,但菜单片段仍显示在其后面。
我假设它与backstack有关,也许我没有正确使用它。任何帮助是极大的赞赏。如果有人可以解释这个问题会很惊人。如果你希望我发布我的conde的任何部分,请告诉我,但我觉得我的问题是在后台堆栈,这是我的代码的一部分,我混乱了后台。
private Fragment visible;
private Fragment mVisibleCached;
@Override
public void onBackPressed() {
super.onBackPressed();
visible = mVisibleCached;
}
。
public void showFragment(int fragIn) {
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
if (visible != null) {
ft.hide(visible);
//ft.remove(visible);
mVisibleCached = visible;
ft.addToBackStack(null);
}
switch (fragIn) {
case 0:
menuFrag = ((MenuFragment) fm.findFragmentByTag(MenuFragment.TAG));
if (menuFrag == null) {
menuFrag = MenuFragment.newInstance();
ft.add(R.id.fragment_container, menuFrag, MenuFragment.TAG);
} else {
// ft.show(menuFrag);
//ft.add(R.id.fragment_container, menuFrag, MenuFragment.TAG);
if (!menuFrag.isVisible()) {
ft.show(menuFrag);
}
}
ft.addToBackStack(null);
visible = menuFrag;
break;
case 1:
programsFrag = ((ListFrag) fm.findFragmentByTag(PROGRAMS_TAG));
if (programsFrag == null) {
programsFrag = ListFrag.newInstance(false);
ft.add(R.id.fragment_container, programsFrag, PROGRAMS_TAG);
} else {
// ft.show(programsFrag);
//ft.add(R.id.fragment_container, programsFrag, PROGRAMS_TAG);
// ft.replace(R.id.fragment_container, programsFrag);
if (!programsFrag.isVisible()) {
ft.show(programsFrag);
}
}
ft.addToBackStack(null);
visible = programsFrag;
break;
case 2:
hostsFrag = ((ListFrag) fm.findFragmentByTag(HOSTS_TAG));
if (hostsFrag == null) {
hostsFrag = ListFrag.newInstance(true);
ft.add(R.id.fragment_container, hostsFrag, HOSTS_TAG);
} else {
// ft.show(hostsFrag);
//ft.add(R.id.fragment_container, hostsFrag, HOSTS_TAG);
// ft.replace(R.id.fragment_container, hostsFrag);
if (!hostsFrag.isVisible()) {
ft.show(hostsFrag);
}
}
ft.addToBackStack(null);
visible = hostsFrag;
break;
case 3:
detailsFrag = ((DetailsFrag) fm.findFragmentByTag(DetailsFrag.TAG));
if (detailsFrag == null) {
detailsFrag = DetailsFrag.newInstance();
ft.add(R.id.fragment_container, detailsFrag, DetailsFrag.TAG);
} else {
//ft.add(R.id.fragment_container, detailsFrag, DetailsFrag.TAG);
if (!detailsFrag.isVisible()) {
ft.show(detailsFrag);
}
}
ft.addToBackStack(null);
visible = detailsFrag;
break;
}
ft.commit();
}
答案 0 :(得分:1)
我按照你的方法解决了这个问题,它不优雅,但对我有用..
我使用整数var和整数的arraylist(整数是片段的id)而不是你的2个片段
int visible;
ArrayList<Integer> cachedVisible= new ArrayList<Integer>();
然后在显示正确片段的方法中,我做了类似的事情
private void setVisibleFragment(int id) {
if(visible!=0){
cachedVisible.add(visible);
}else{
cachedVisible.add(R.id.home);
}
switch (id) {
case R.id.settings:
visible=R.id.settings;
break;
case R.id.services:
ft.hide(fm.findFragmentById(R.id.settings_frag));
ft.hide(fm.findFragmentById(R.id.plugin_frag));
ft.show(fm.findFragmentById(R.id.service_frag));
ft.addToBackStack(null);
ft.commitAllowingStateLoss();
visible=R.id.services;
break;
....
}
}
最后是FragmentActivity
public void onBackPressed() {
if(cachedVisible.size()==0){
finish();
}else{
visible = cachedVisible.get(cachedVisible.size()-1);
cachedVisible.remove(cachedVisible.size()-1);
}
setVisibleFragment(visible);
cachedVisible.remove(cachedVisible.size()-1);
}
希望它可以帮助某人;)