我正在尝试使用actionbarsherlock来学习如何使用片段。我试着关注this tutorial。一切正常,直到我试图创建另一个片段,这将不是动作栏的一部分。用户单击其中一个片段中的按钮:
那个片段打开了:
我想点击后退按钮并返回上一个片段。这就是我尝试这样做的方法 - 将这个片段添加到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",然后点击后退按钮,这就是我得到的:
两个碎片相互重叠。如果我继续点击其他标签 - 它会更加混乱(我有一个视频,但似乎我不能在这里嵌入视频)。
这是我的主要活动的代码:
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
}
}
为什么会发生这种情况?如何解决?
答案 0 :(得分:0)
在将应用转换为操作栏/片段时,我经常遇到这种类型的事情。你没有隐藏/分离旧片段。
我建议您在onTabUnselected
中执行类似的操作 if (mFragment != null) {
ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.hide(mFragment); //hide old fragment ...
ft.detach(mFragment); //detach
ft.commitAllowingStateLoss();
}
有关详细信息,我建议这样做(它包含可以帮助您的示例TabListener代码):