0

我正在尝试学习如何使用 actionbarsherlock 处理片段。我尝试按照本教程进行操作。一切正常,直到我尝试创建另一个片段,它不会成为操作栏的一部分。用户单击其中一个片段中的按钮:
在此处输入图像描述
该片段打开:
在此处输入图像描述
我想单击后退按钮并返回到前一个片段。这就是我尝试这样做的方式 - 将此片段添加到后台堆栈:

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

如果我在这个阶段单击后退按钮 - 它可以工作,我会返回到上一个片段(目录)。但是,如果此时我转到另一个选项卡,例如“社交”,然后点击后退按钮,这就是我得到的:
在此处输入图像描述
两个片段相互重叠。如果我继续点击其他标签 - 它会更加混乱(我有它的视频,但似乎我无法在此处嵌入视频)。

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

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

还有我的 Tab Listener 的代码:

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

为什么会发生,如何解决?

4

1 回答 1

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

于 2013-07-03T09:57:48.063 回答