0

首先谢谢你看这个。我有 4 个片段。一种是显示菜单的菜单片段。我有 2 个显示数据和图片列表的列表片段。第 4 个片段是细节片段。一切开始正常。

设置:

我单击它显示的列表按钮,菜单片段隐藏在它后面。

我单击列表片段中的一个条目,它使用一个接口来传递数据并显示详细信息片段。

一旦它将我带到应有的列表片段,我单击后退按钮。

我再次单击后退按钮,它会显示应有的菜单片段。

问题:

如果我再次单击列表按钮,则会显示列表,但菜单片段仍显示在其后面。

我假设它与后台堆栈有关,也许我没有正确使用它。任何帮助是极大的赞赏。如果有人能解释这个问题,那就太棒了。如果您希望我发布我的 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();
}
4

1 回答 1

1

我按照你的方法解决了这个问题,它并不优雅,但它对我有用..

而不是你的 2 个片段,我使用了一个整数 var 和一个整数数组列表(整数是片段的 id)

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

希望它可以帮助某人;)

于 2013-05-15T23:07:25.003 回答