如果我可以使用findViewById()直接获取视图,为什么我应该使用LayoutInflater来获取视图

时间:2015-11-10 15:43:22

标签: android layout-inflater

我是Android开发的初学者,我很难理解Inflater的用法。我已经读过这个问题了:

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();

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

使用inflater获取的视图与使用findViewById获得的视图之间有什么区别。

1 个答案:

答案 0 :(得分:0)

它不是一回事。

Inflate接受一个Layout xml文件并从中创建一个View。

findViewById在viewGroup中查找视图。

在你的例子中:

您的第一个代码会膨胀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需要一个已经膨胀的视图。

希望这有帮助。