2013-04-10 121 views
18

我有一个带3个选项卡的操作栏,每个选项卡打开一个片段。第三个选项卡,“目录”,有一个列表: enter image description here彼此重叠的片段

当我点击它打开另一个片段中的项目,这是不操作栏的一部分:

public void onClick(View v) { 
    switch (v.getId()) 
    { 
    case R.id.category1:  
     Fragment cosmeticsFragment = new ActivityCosmetics(); 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

     transaction.replace(android.R.id.content, cosmeticsFragment); 
     transaction.addToBackStack(null); 

     transaction.setTransition(1); 

     transaction.commit(); 
     break; 
     ... 

这是个什么样子像后: enter image description here

从这一点来说,如果我去其他选项卡,然后返回到目录选项卡,我看到前面2个片段相互重叠:

enter image description here

如何防止它发生?

回答

4

您可以通过标记搜索来管理您的片段。当添加片段到堆栈中添加标签名

transaction.addToBackStack("myCustomFragmentTag"); 

如果你想在应用程序的任何地方破坏片段:

Fragment previousInstance = getFragmentManager().findFragmentByTag("myCustomFragmentTag"); 
       if (previousInstance != null) 
        transaction.remove(previousInstance); 

你可以尝试覆盖某些行为,所以这行代码“会过去的片段

销毁初始化
getFragmentManager().popBackStack(); 
+0

我试着按如下方式使用它:'transaction.addToBackStack(“CategoryFragment”);'然后尝试在onResume和onTabReselected方法中使用其余的代码。但我仍然看到这些片段重叠... – Igal 2013-04-10 12:35:17

+0

我在我的演示应用程序中有同样的问题... – Jayesh 2013-05-17 11:20:10

+0

让我看看你的代码在pastebin.com .... – Jayesh 2013-05-18 12:31:01

0

你可以尝试这样的标签..

public class Tabs extends TabActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tabs); 
    Resources res = getResources(); // Resource object to get Drawables 
    TabHost tabHost = getTabHost(); // The activity TabHost 
    TabHost.TabSpec spec; // Resusable TabSpec for each tab 
    // Intent intent; // Reusable Intent for each tab 
    // Create an Intent to launch an Activity for the tab (to be reused) 
    Intent intent1 = new Intent().setClass(this, Social.class); 
    // Initialize a TabSpec for each tab and add it to the TabHost 
    spec = tabHost.newTabSpec("app_name").setIndicator("Practice", 
         res.getDrawable(R.drawable.tab_social)) 
        .setContent(intent1); 
    tabHost.addTab(spec); 
    tabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.bbgg); 
    // Do the same for the other tabs 
    Intent intent2 = new Intent().setClass(this, Web.class); 
    spec = tabHost.newTabSpec("application").setIndicator("Application", 
         res.getDrawable(R.drawable.tab_web)) 
        .setContent(intent2); 
    tabHost.addTab(spec); 
    tabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.bbgg); 
    Intent intent3 = new Intent().setClass(this, Catalog.class); 
    spec = tabHost.newTabSpec("toplinks").setIndicator("Top Links", 
         res.getDrawable(R.drawable.tab_catalog)) 
        .setContent(intent3); 
    tabHost.addTab(spec); 
    tabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.bbgg); 
    tabHost.setCurrentTab(0); 
} 
} 

在你的布局XML

<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 

    <LinearLayout 
android:id="@+id/LinearLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 
    <TabWidget 
android:id="@android:id/tabs" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"></TabWidget> 
<FrameLayout 
android:id="@android:id/tabcontent" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"></FrameLayout> 
</LinearLayout> 
</TabHost> 
3

设置背景的片段布局可以解决这个问题。

+0

这应该是一个评论。 – 2016-01-30 10:32:31

+0

android:background =“?android:colorBackground” – 2016-02-13 19:42:10

+0

您还必须在下面添加以便点击不会传递到旧片段==> android:clickable =“true” – 2016-02-13 19:43:02