片段和backStack显示/隐藏

时间:2013-01-17 20:46:52

标签: android android-fragments

首先,谢谢你看这个。 我有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();
}

1 个答案:

答案 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);   
}

希望它可以帮助某人;)

相关问题