【问题标题】:Fragments overlapping each other片段相互重叠
【发布时间】:2013-04-02 02:28:08
【问题描述】:

我有一个带有 3 个选项卡的操作栏,每个选项卡打开一个片段。第三个选项卡“目录”有一个列表:

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

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

这就是之后的样子:

从这一点开始,如果我转到其他选项卡,然后返回目录选项卡,我会看到之前的 2 个片段相互重叠:

如何防止它发生?

【问题讨论】:

    标签: android android-fragments android-actionbar fragment


    【解决方案1】:

    为片段布局设置背景可以解决此问题。

    【讨论】:

    • 这应该是一条评论。
    • android:background="?android:colorBackground"
    • 你也必须在下面添加这样点击不会传递给旧片段 ==> android:clickable="true"
    • 为片段添加背景不是正确的解决方案。它只是一个 hack
    【解决方案2】:

    您可以通过按标签搜索片段来管理片段。将fragment添加到backstack时添加TAG名称

    transaction.addToBackStack("myCustomFragmentTag");
    

    如果你想在应用程序的任何地方销毁 Fragment:

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

    您可以尝试覆盖某些行为,这样这行代码将销毁最后一个已初始化的 Fragment

    getFragmentManager().popBackStack(); 
    

    【讨论】:

    • 我尝试按如下方式使用它:transaction.addToBackStack("CategoryFragment"); 然后尝试在 onResume 和 onTabReselected 方法中使用其余代码。但我还是看到了这些碎片重叠……
    【解决方案3】:

    根据这个问题: Android: fragments overlapping issue

    您只需在 XML 文件中设置背景颜色

    解决这个问题。

    【讨论】:

      【解决方案4】:

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

         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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        相关资源
        最近更新 更多