Android: setContentView and LayoutInflater

6

setContentView和LayoutInflater有何区别?为什么我们在自定义toast中使用inflater,在自定义alertbox中使用setContentView?


2
我认为这里有一个对你有帮助的好答案:https://dev59.com/xWMm5IYBdhLWcg3wKsrO - Liem Vo
4个回答

18

在了解之前,您需要明白一些事情。

Android中,每个Activity都有一个ViewRoot和通常只有一个附加的Window。然而,SurfaceView有自己的窗口。因此,如果一个Activity包含一个SurfaceView,它将拥有多个窗口。

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

基本上,ViewRoot负责收集和分派输入,View负责管理焦点/键事件,Canvas仅负责使用onDraw()进行"绘制"操作。

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

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

Toast的情况下,如果要动态地改变子视图,例如在运行时更改图像,则会使用LayoutInflater。如果不需要更改子视图,则仅需使用toast的setView(View)即可设置toast的布局视图。

如果你仔细观察,AlertDialogToast是一样的。

希望能对您有所帮助。


确实有帮助,谢谢。但作为新手,我需要更多的探索。 - user3505180
这样的答案对我来说很少见。谢谢! - Anurag Kalia

3

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

在警报对话框中,我们不提供充气布局的根元素,因为该布局添加到FrameLayout元素中的id为“custom”,如在alert_dialog.xml中指定的那样。请参考alert_dialog.xml

1

setContentView() 通常用于加载一个 activity。 inflate 只会生成一个视图类对象,如果需要的话,就使用 setContentView(view)。 一般情况下通过 setContentView() 接口显示活动,但是在非活动状态下如何控制布局设置,则需要使用 LayoutInflater 进行动态加载。例如,当您为 spinner 使用适配器类时,可能需要使用 LayoutInflater


1

setContentView() : 这个方法设置你的背景布局。

LoayoutInflater: 假设你使用listview并且需要显示10个项目,则layoutIflat会显示10个项目。

inflater: 它是你的布局设计所需的,保留layoutInflat的值。

Custom Toast: 这是你的字符串输出方式。自定义toast意味着你希望设计输出,时尚的输出展示。

抱歉,我也不知道alertbox。非常感谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接