setContentView和LayoutInflater有何区别?为什么我们在自定义toast中使用inflater,在自定义alertbox中使用setContentView?
setContentView和LayoutInflater有何区别?为什么我们在自定义toast中使用inflater,在自定义alertbox中使用setContentView?
在了解之前,您需要明白一些事情。
在Android
中,每个Activity
都有一个ViewRoot
和通常只有一个附加的Window
。然而,SurfaceView
有自己的窗口。因此,如果一个Activity
包含一个SurfaceView
,它将拥有多个窗口。
这个活动用于占据整个窗口的屏幕显示。视图附加到这个窗口上。每个窗口都有一个表面,表面使用Canvas
在其上绘制。视图附加到的窗口拥有该表面。
基本上,ViewRoot
负责收集和分派输入,View
负责管理焦点/键事件,Canvas
仅负责使用onDraw()
进行"绘制"操作。
setContentView(View)
是专门为Activity
提供的方法。内部调用Window
的setContentView(View)
。此方法将活动内容设置为显式视图。此视图直接放置在活动的视图层次结构中。从此时起,调用此函数将“锁定”窗口的各种特征,无法从此时起更改。因此,它仅被调用一次。
LayoutInflater
用于将布局XML文件实例化为相应的View对象。基本上,目的是根据需求在运行时创建视图对象。最好的例子是像ListView
、Spinner
等这样的AdapterViews
,在运行时根据记录数创建一个对应于单个记录的单个视图对象。
在Toast
的情况下,如果要动态地改变子视图,例如在运行时更改图像,则会使用LayoutInflater
。如果不需要更改子视图,则仅需使用toast的setView(View)
即可设置toast的布局视图。
如果你仔细观察,AlertDialog
和Toast
是一样的。
希望能对您有所帮助。
setContentView内部使用Inflater来实现其功能。它是一个方便的方法,它将负责为被引入的布局分配父/根视图元素。它还初始化ActionBar。
以下是Android源代码:Activity.java
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}
com/android/internal/policy/impl/PhoneWindow.java
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
关于您的第二个问题,我们在自定义toast和自定义alert对话框中都使用了inflater。 例如:自定义Toast创建:
Toast toast = new Toast(getApplicationContext());
toast.setView(inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.toast_layout_root)));
例如:创建自定义警报对话框:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(inflater.inflate(R.layout.dialog_signin, null));
setContentView()
通常用于加载一个 activity。 inflate
只会生成一个视图类对象,如果需要的话,就使用 setContentView(view)。
一般情况下通过 setContentView()
接口显示活动,但是在非活动状态下如何控制布局设置,则需要使用 LayoutInflater
进行动态加载。例如,当您为 spinner 使用适配器类时,可能需要使用 LayoutInflater
。
setContentView() : 这个方法设置你的背景布局。
LoayoutInflater: 假设你使用listview并且需要显示10个项目,则layoutIflat会显示10个项目。
inflater: 它是你的布局设计所需的,保留layoutInflat的值。
Custom Toast: 这是你的字符串输出方式。自定义toast意味着你希望设计输出,时尚的输出展示。
抱歉,我也不知道alertbox。非常感谢。