我想构建一个看起来像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中添加两个单独的容器,但我想在应用程序中使用更大的片段来回替换这两个片段。 我应该把第二个容器留空吗? 或者还有更好的方法吗?
提前致谢!