【发布时间】:2018-05-10 17:21:30
【问题描述】:
我想构建一个看起来像this 的视图,其中 Fragment2 的高度应该包裹它的内容,而 Fragment1 应该填充上面的剩余空间。
在阅读了执行此操作的方法后,我得到了该活动的以下 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 中添加两个单独的容器,但我想在应用程序中用更大的片段来回替换这两个片段。 那我应该把第二个容器空着吗? 还是有更好的办法?
提前致谢!
【问题讨论】:
-
我认为根据你的代码,你是先创建 fragment1 然后创建 fragment2,然后先创建 fragment2 然后再创建 fragment1(因为上述条件只适用于这种情况)。
-
以及为什么要将片段替换为相同的“R.id.fragment_container”,我认为您正在为两个片段替换相同的片段容器。
-
哦,那是一个错误(我将片段的名称更改为代码 sn-ps),我做到了!已编辑
标签: android android-layout android-fragments android-activity android-relativelayout