膨胀多个布局

Inflate multiple layouts

在片段中,我尝试膨胀除根布局之外的两个布局:

View a, b;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

     View root = inflater.inflate(R.layout.list_fragment, container, false);

    //..
    a = inflater.inflate(R.layout.empty_list_view, container);
    b = inflater.inflate(R.layout.progress_list_view, container);
    //..

    return root;
}

public void showB() {
    a.setVisibility(GONE);
    b.setVisibility(VISIBLE);
}

所以我只是 return 来自 onCreateView 方法的单个布局。但是我又给两个充气了,a和b。

然而当我显示b时实际上会显示a。所以 progress_list_view 永远不会出现。有人可以解释这种奇怪的行为吗?

我怀疑a和b都添加到了容器(ViewGroup)中。而且由于先加了a,所以会先显示。

您只能从 onCreateView 中 return 一个视图。 returned 的视图是显示的视图。看起来你总是 return 查看 a.

编辑:

关键是,你正在做一团糟,而且没有充分的理由这样做。

那里发生的事情是你膨胀根,但没有用这条线将它附加到容器 View root = inflater.inflate(R.layout.list_fragment, container, false);

然后你膨胀两个视图并使用这些行 a = inflater.inflate(R.layout.empty_list_view, container); 将它们直接添加到容器中,根据 Fragment 文档,这是错误的做法:

The fragment should not add the view itself, but this can be used to generate the LayoutParams of the view

ab 也是同一个对象,根据 LayoutInflater

的文档,这是 container 对象

If root was supplied, this is the root

而root是你提供的,是container,所以你的基本和a=container;一样 b=container;

然后你 return root,此时我真的不知道由于这个混乱而发生了什么。我描述了。

幸运的是修复很容易:

像这样创建另一个 XML 布局(缩短):

<FrameLayout>
    <include layout="@layout/empty_list_view"/>
    <include layout="@layout/progress_list_view"/>
</FrameLayout>

然后你给这个新的充气 XML:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View root = inflater.inflate(R.layout.new_xml, container, false);
    a = root.findViewById( .. ID of the root of empty_list_view.. )
    b = root.findViewById( .. ID of the root of progress_list_view.. )
    return root;
}

那么代码就可以工作了。

原答案:

没有异常行为。您扩充了这些布局,并且有 2 个 View 对象代表它们。但是没有将那些 Views 附加到 UI。

只有您 return 来自 onCreateView 方法的视图将附加到设备 UI。

例如:

以下代码将显示 a:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //..
    View a = inflater.inflate(R.layout.empty_list_view, container);
    View b = inflater.inflate(R.layout.progress_list_view, container);
    //..
    return a;
}

以下代码将显示 b:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //..
    View a = inflater.inflate(R.layout.empty_list_view, container);
    View b = inflater.inflate(R.layout.progress_list_view, container);
    //..
    return b;
}

如果你想把它们放在一起,你应该把它们放在一起在 XML 布局文件中。如果您需要可重复使用,也许可以使用 include 标签。

R.layout.list_fragment 应该看起来像这样:

<FrameLayout>
    <include 
        android:id="@+id/a"
        layout="@layout/empty_list_view"/>
    <include 
        android:id="@+id/b"
        layout="@layout/progress_list_view"/>
</FrameLayout>

您的代码将如下所示:

View a, b;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View root = inflater.inflate(R.layout.list_fragment, container, false);
    a = root.findViewById(R.id.a);
    b = root.findViewById(R.id.b);

    return root;
}

public void showB() {
    a.setVisibility(GONE);
    b.setVisibility(VISIBLE);
}

/** 在首次创建 activity 时调用。 */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout layoutMain = new LinearLayout(this);
    layoutMain.setOrientation(LinearLayout.HORIZONTAL);
    setContentView(layoutMain);
    LayoutInflater inflate = (LayoutInflater)       getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // 1st Layout
    RelativeLayout layoutLeft = (RelativeLayout) inflate.inflate(
        R.layout.main, null);

    // 2nd Layout
    RelativeLayout layoutRight = (RelativeLayout) inflate.inflate(
       R.layout.row, null);

    RelativeLayout.LayoutParams relParam = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.WRAP_CONTENT,
    RelativeLayout.LayoutParams.WRAP_CONTENT);
    layoutMain.addView(layoutLeft, 100, 100);
    layoutMain.addView(layoutRight, relParam);
 }

为什么不在容器中扩充新视图。

试试这个

LayoutInflater mInflater  = null;  
ViewGroup mContainer = null;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mInflater = inflater;
    mContainer = container;
    View root = inflater.inflate(R.layout.list_fragment, container, false);
    return root;
}

public void showB() {
    mInflater.inflate(R.layout.progress_list_view, mContainer, false);
}


public void showA() {
    mInflater.inflate(R.layout.empty_list_view, mContainer, false);
}