使用LayoutInflater.inflate()在android

时间:2017-09-28 21:41:32

标签: android toast layout-inflater android-toast

Greetings Stack Overflow社区

创建自定义Toast android developer guide以及此stack overflow post时,都提供以下示例:

my_custom_toast.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/toast_container"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          >
    <ImageView android:src="@drawable/droid"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               />
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              />
</LinearLayout>

MainActivity.java

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(
    R.layout.my_custom_toast,
    (ViewGroup) findViewById(R.id.toast_container)
);

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

一些笔记

如果第二个参数为null,则inflate()应该返回xml文件的根,即名为toast_container的LinearLayout。 否则,如果ViewGroup作为第二个参数传递,那么inflate()应该将膨胀的层次结构附加到此ViewGroup并返回提供的ViewGroup(现在是膨胀布局的父级)。

我有两个问题:

首先

提供第二个参数的目的是什么?默认情况下,如果我们传递null,将返回标识为@+id/toast_container的LinearLayout。

第二

如何将膨胀的层次结构夸大(和嵌入)给自己的一个成员?或者,上面使用的inflate()被认为是不合适的吗?

换句话说,此代码将布局膨胀(并嵌入)到其自己的成员之一,即LinearLayout(check @+id/toast_container)。 这通过将xml文件膨胀为第二个LinearLayout来复制LinearLayout。

1 个答案:

答案 0 :(得分:0)

回答你的第一个问题,视图的膨胀将使用第二个参数,以便正确地执行几个步骤。主要与LayoutParams类有关(许多视图类都有一个对应的LayoutParams类)。如果您尝试使用边距,这些可能仅在您传递第二个参数时才有效。

问题2:您误解了文档。如果你传递第二个参数ViewGroup,我称之为'parent',你的布局将被夸大为'parent',函数返回'parent'。

如果您没有传递第二个参数,该函数会使您的布局膨胀并返回布局本身(根/顶视图)。