【问题标题】:Fragments overlapping on FrameLayoutFrameLayout 上重叠的片段
【发布时间】:2017-03-21 11:06:22
【问题描述】:

我正在尝试将多个片段添加到 FrameLayout。我需要将它们添加到另一个下方。但它们是重叠的。

ma​​in_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

MainActivity.java

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

            // Create instance of fragments
            FragmentPrimaryList firstFrag = new FragmentPrimaryList();
            FragmentSecondaryList secFrag = new FragmentSecondaryList();

            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            // add fragment to the fragment container layout
            fragmentTransaction.add(R.id.fragment_container,firstFrag);
            fragmentTransaction.add(R.id.fragment_container,secFrag);

            fragmentTransaction.commit();
        }
    }

他们看起来像这样。我该如何解决这个问题?

【问题讨论】:

  • 您正在添加新片段,但没有隐藏旧片段。
  • FrameLayout 就是这样做的。如果您希望它们从上到下堆叠,请改用垂直的LinearLayout
  • @MihirTrivedi 我需要同时显示两个片段,一个在另一个之下。
  • @MikeM。将现有的 FrameLayout 更改为 LinearLayout。但现在只显示一个片段。仅限第一个片段。
  • @MikeM。是的。 wrap_content 成功了。谢谢。

标签: android android-fragments android-framelayout


【解决方案1】:

使用replace 方法代替add 方法。

replace 方法在添加新片段之前隐藏当前片段,add 方法只是添加新片段而不丢弃旧片段。

为了保留回栈,使用带有backstack管理的片段事务。

【讨论】:

    【解决方案2】:

    我需要同时显示两个片段,一个在另一个之下

    你可以试试下面的布局:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </FrameLayout>
    </LinearLayout>
    

    现在使用以下命令添加片段:

    fragmentTransaction.add(R.id.fragment_container1,firstFrag);
    

    确保你是 Fragment 的layout_height = "wrap_content"

    【讨论】:

    • 无法像您的答案那样预先定义 FrameLayout 。它取决于通过 Web 服务接收的数据。它可能需要同时显示 3 或 4 个片段。
    【解决方案3】:

    为您的片段添加背景并将“android:clickable="true" 设置为父布局。

    【讨论】:

      【解决方案4】:

      这样做:

      第一个片段

      FragmentPrimaryList firstFrag = new FragmentPrimaryList();
      FragmentManager  fragmentManager = getSupportFragmentManager();
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
      
      // add fragment to the fragment container layout
      fragmentTransaction.add(R.id.fragment_container,firstFrag);
      fragmentTransaction.commit();
      

      第二个片段

      FragmentSecondaryList secFrag = new FragmentSecondaryList();
      fragmentManager = getSupportFragmentManager();
      fragmentTransaction = fragmentManager.beginTransaction();
      fragmentTransaction.add(R.id.fragment_container,secFrag);
      fragmentTransaction.commit();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2020-08-22
        • 1970-01-01
        • 2020-11-23
        • 2014-03-05
        • 1970-01-01
        相关资源
        最近更新 更多