我是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获得的视图之间有什么区别。
答案 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需要一个已经膨胀的视图。
希望这有帮助。