以编程方式将多个片段添加到RelativeLayout

时间:2017-11-27 12:52:56

标签: android android-layout android-fragments android-activity android-relativelayout

我想构建一个看起来像this的视图,其中Fragment2的高度应该包含其内容,Fragtment1应该填充上面的剩余空间。

在阅读了相关方法之后,我获得了以下活动的layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jamest.textadventuretest.MainActivity">

    <fragment
        android:id="@+id/fragment1"
        android:name="com.jamest.textadventuretest.Fragment1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/fragment2" />

    <fragment
        android:id="@+id/fragment2"
        android:name="com.jamest.textadventuretest.Fragment2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

它有效。 现在我想做同样的事情,但是以编程方式,以便我可以用另一个片段替换/添加这两个片段(同时)。

我在layout.xml中注释掉了两个片段块,并将以下内容添加到onCreate() - 我的活动方法中:

fragment2 = new Fragment2();
fragment1 = new Fragment1();

getSupportFragmentManager().beginTransaction()
    .add(R.id.fragment_container, fragment2)
    .add(R.id.fragment_container, fragment1).commit();

现在我必须设置layout_above和layout_alignParentBottom参数,以便正确显示。

首先,我尝试在提交后通过调用fragment1.getView()将这些参数设置为视图,但是我得到了NullPointerException。 在阅读之后我明白,只有在调用片段的onCreateView()方法之后我才能访问视图,并且在调用commit()之后不是这种情况。即使它后面是

getSupportFragmentManager().executePendingTransactions()

所以我在片段中创建了一个接口,在创建视图后调用方法(在onActivityCreated()中),活动实现这些接口。

实现的方法如下所示:

@Override
public void onCreatedFragment1() {
    RelativeLayout.LayoutParams params =  new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
    params.addRule(RelativeLayout.ABOVE, R.layout.fragment2);
    fragment1.getView().setLayoutParams(params);
}

@Override
public void onCreatedFragment2() {
    RelativeLayout.LayoutParams params =  new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,1);
    fragment2.getView().setLayoutParams(params);
}

但是,我只能看到Fragment2顶部的Fragment1 ...... 如果我注释掉Fragment1,我可以看到Fragment2在底部对齐。

解决这个问题的最佳方法是什么?

我想我可以在活动的layout.xml中添加两个单独的容器,但我想在应用程序中使用更大的片段来回替换这两个片段。 我应该把第二个容器留空吗? 或者还有更好的方法吗?

提前致谢!

0 个答案:

没有答案