既然可以直接用findViewById()获取view,为什么还要用LayoutInflater获取view

Why should I use LayoutInflater to obtain a view if I can directly obtain it using findViewById()

我是 android 开发的初学者,很难理解 Inflater.I 的使用 已经阅读了这个问题:

What does it mean to inflate a view from an xml file?

现在考虑这个例子:

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
                               (ViewGroup) findViewById(R.id.toast_layout_root));
Toast toast = new Toast(getApplicationContext());
toast.setView(layout);
toast.show();

据我了解,我们使用 inflater 将 xml 布局膨胀(转换)为 View 对象,然后使用 setView(layout) 设置视图。 但是如果我们只需要设置 toast 的视图那么为什么不简单地使用 findviewbyid 如下:

Toast toast=new Toast(this);
toast.setView(findViewById(R.id.toast_layout_root));
toast.setDuration(toast.LENGTH_LONG);
toast.show();

上面的代码可以编译,但它会导致应用程序在启动时崩溃 up.I 知道这样做是错误的,但为什么呢?

inflater获取的view和findViewById获取的view有什么区别

这不是一回事。

Inflate 使用布局 xml 文件并从中创建视图。

findViewById 在 vi​​ewGroup 中查找视图。

在你的例子中:

您的第一个代码将膨胀 R.layout.custom_toast 并将其附加到父 ViewGroup R.id.toast_layout_root

您的第二个代码将采用 R.id.toast_layout_root ViewGroup 并将其设置为对话框的布局。

基本上,您的第一个代码将以 R.layout.custom_toast 作为对话框布局,而您的第二个代码将使用 R.id.toast_layout_root 作为对话框布局。

这显然不是一回事,findViewById 需要一个已经膨胀的视图。

希望对您有所帮助。