Android:setContentView和LayoutFlater

Android:setContentView和LayoutFlater,android,android-layout,Android,Android Layout,setContentView和LayoutInflater之间有什么区别? 我们在customtoast和customalertbox中使用充气机和设置内容视图的原因是什么?设置内容视图()通常用于加载活动充气仅布局形成视图类对象,如有必要,设置ContentView(视图)。 一般活动通过setContentView()界面显示,但如何控制布局被设置为在非活动中操作,这需要LayoutInflater动态加载。例如,当您为微调器使用适配器类时,可能必须使用LayoutInflatersetCo

setContentView
LayoutInflater
之间有什么区别? 我们在custom
toast
和custom
alertbox
中使用
充气机
设置内容视图
的原因是什么?

设置内容视图()
通常用于加载活动<代码>充气
仅布局形成视图类对象,如有必要,设置ContentView(视图)。 一般活动通过
setContentView(
)界面显示,但如何控制布局被设置为在非活动中操作,这需要
LayoutInflater
动态加载。例如,当您为微调器使用适配器类时,可能必须使用
LayoutInflater

setContentView():此方法设置后台布局

LoyoutInflator:假设您使用listview并需要显示列表10项,那么LayoutFlat将为显示10项执行操作

充气机:这是您的布局设计所需要的,为 平铺

自定义土司:这是字符串输出的方式。自定义土司表示您希望设计输出。设计师输出显示


对不起,兄弟,我也不知道alertbox。谢谢你,这里有很多不同

setContentView内部使用充气机来实现它的功能。这是一种方便的方法,它将负责为正在膨胀的布局分配父/根视图元素。它还初始化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对话框中都使用了充气机。 e、 g.定制吐司制作:

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));
e、 g.自定义警报对话框创建:

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

在警报对话框的情况下,我们不提供膨胀布局的根目录,因为布局被添加到FrameLayout元素中,id为“custom”,如

中所指定,您需要先了解一些事情

Android
中,每个
活动
都有一个
ViewRoot
,通常还有一个
窗口
。但是,
SurfaceView
有自己的窗口。因此,如果一个
活动
有一个
表面视图
,它将有多个窗口

此活动用于占据整个窗口的屏幕显示。视图已附加到此窗口。每个窗口都有一个曲面,曲面使用
Canvas
在曲面上绘制。视图附加到的窗口拥有该曲面

基本上,
ViewRoot
负责收集和发送输入,
View
负责管理焦点/关键事件,
Canvas
只负责使用
onDraw()进行“绘制”操作

setContentView(View)
是一种专门用于
活动的方法。它在内部调用
窗口的
setContentView(View)
。此方法将活动内容设置为显式视图。此视图直接放置在活动的视图层次结构中。调用此函数“锁定”窗口的各种特性,从现在起,这些特性无法更改。因此,它只被称为一次

LayoutInflater
用于将布局XML文件实例化为其相应的视图对象。基本上,其目的是根据需求在运行时创建视图对象。 最好的例子是
AdapterViews
ListView
Spinner
等,其中在运行时根据记录的数量创建对应于单个记录的单个视图对象

Toast
的情况下,如果要动态更改子视图,例如在运行时更改图像,则使用
LayoutInflater
。如果不对子视图进行任何更改,则toast的
setView(View)
就足以设置toast的布局视图

如果仔细观察,
AlertDialog
Toast
相同


希望对您有所帮助。

我想这是一个很好的答案,确实对您有所帮助,谢谢。但是作为一个新手,我需要更多的探索。这样的答案对我来说很少见。谢谢