如果没有layout_weight属性,LinearLayout中的片段不会出现

时间:2013-11-05 14:27:02

标签: android android-layout android-fragments android-linearlayout

我在一个活动( MyActivity )中有两个片段( MyListFragment MyDetailFragment )。第一个片段是项目列表,第二个片段是项目的详细信息(这是另一个列表,但我认为无关紧要)。 MyActivity 启动时会显示第一个列表片段。

MyListFragment 视图:

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

MyDetailFragment 视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">

    <ListView
            android:id="@android:id/list"
            android:tag="@string/activities_list_tag"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

</LinearLayout>

MyListFragment 上有一个点击处理程序,它调用 MyActivity 中的方法,打开 MyDetailFragment

@Override
public void onActionSelected(MAction action, Integer position){
/**some code...*/
    getFragmentManager().beginTransaction()
                    .replace(R.id.fragment_container, 
                     new MyDetailFragment(mAction,position)).commit();
}

问题是:

当我点击 MyListFragment 中的任何项目时, MyDetailFragment 将不会显示(虽然我知道它的生命周期方法被正确调用)。

我发现当我将 android:layout_weight =“1”放入 MyListFragment 中的片段定义时,它可以正常工作。 有人知道为什么吗?

据我了解android:layout_weight属性,只有在LinearLaoyout中有更多视图时它才会起作用,但我只有一个。

这是工作布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/fragment_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent" >
    <fragment class="myapp.ActionsList"
              android:id="@+id/actions_list_fragment"
              **android:layout_weight="1"**
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
</LinearLayout>

由于

3 个答案:

答案 0 :(得分:0)

getFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, 
                 new MyDetailFragment(mAction,position)).commit();

您正在完全替换片段,因此一次fragment_container中只有一个片段的视图。最好将fragment_container设为FrameLayout,并将片段布局根的高度和宽度设置为match_parent

答案 1 :(得分:0)

你使用layout_weight是错误的,我不认为你理解它的功能。要在LinearLayout parrent中运行,您必须具有weightSum,它将是布局的总重量。第二件事是根据LinearLayout方向设置childs weight或height 0dp。布局的每个子项必须具有layout_weight,并且权重的总和等于weightSum。这样布局将根据您的体重自动分割。

答案 2 :(得分:0)

好吧,我做错了一件事。

只能以编程方式加载的片段。不是xml中定义的片段。

但我不知道。因为MyListFragmentView在xml定义中包含片段,所以虽然我调用了replace,但是该方法并没有将actions_list_fragment替换为新的,而是在actions_list_fragment之后添加了新的。这就是layout_weights使它工作的原因 - 根LinearLayout中有两个孩子,但我只有一个。