actionbarsherlock片段和backstack的问题

时间:2013-07-03 09:00:02

标签: android android-fragments actionbarsherlock back-stack

我正在尝试使用actionbarsherlock来学习如何使用片段。我试着关注this tutorial。一切正常,直到我试图创建另一个片段,这将不是动作栏的一部分。用户单击其中一个片段中的按钮:
enter image description here
那个片段打开了:
enter image description here
我想点击后退按钮并返回上一个片段。这就是我尝试这样做的方法 - 将这个片段添加到backstack:

public void onClick(View v) {
    switch (v.getId()){
    case R.id.btn1:
        ft.replace(R.id.fragment_container, Fragment_Products);
        ft.addToBackStack(null);
        ft.commit();
        break;
    }
}

如果我在此阶段单击后退按钮 - 它可以工作,我将返回上一个片段(目录)。但是,如果此时我转到另一个标签,例如" Social",然后点击后退按钮,这就是我得到的:
enter image description here
两个碎片相互重叠。如果我继续点击其他标签 - 它会更加混乱(我有一个视频,但似乎我不能在这里嵌入视频)。

这是我的主要活动的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setTitle("Fragments app");

    ActionBar.Tab FragmentSocialTab = actionBar.newTab().setText("Social")
            .setIcon(android.R.drawable.star_on);
    ActionBar.Tab FragmentWebTab = actionBar.newTab().setText("Web");
    ActionBar.Tab FragmentCatalogTab = actionBar.newTab().setText("Catalog");

    Fragment Fragment_Social = new Fragment_Social();
    Fragment Fragment_Web = new Fragment_Web();
    Fragment Fragment_Catalog = new Fragment_Catalog();

    FragmentSocialTab.setTabListener(new TabsListener(Fragment_Social));
    FragmentWebTab.setTabListener(new TabsListener(Fragment_Web));
    FragmentCatalogTab.setTabListener(new TabsListener(Fragment_Catalog));

    actionBar.addTab(FragmentCatalogTab);
    actionBar.addTab(FragmentWebTab);
    actionBar.addTab(FragmentSocialTab);

    actionBar.setSelectedNavigationItem(2);
}

我的标签监听器的代码:

class TabsListener implements ActionBar.TabListener{
    public Fragment fragment;

    public TabsListener(Fragment fragment){
        this.fragment = fragment;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub      
    }
}

为什么会发生这种情况?如何解决?

1 个答案:

答案 0 :(得分:0)

在将应用转换为操作栏/片段时,我经常遇到这种类型的事情。你没有隐藏/分离旧片段。

我建议您在onTabUnselected

中执行类似的操作
        if (mFragment != null) { 
                 ft = mActivity.getSupportFragmentManager().beginTransaction();  

                 ft.hide(mFragment);    //hide old fragment ...
                 ft.detach(mFragment);  //detach 

                 ft.commitAllowingStateLoss();   

        }

有关详细信息,我建议这样做(它包含可以帮助您的示例TabListener代码):

http://developer.android.com/guide/topics/ui/actionbar.html