Android:setContentView和LayoutInflater

时间:2014-04-07 03:16:50

标签: android android-layout

setContentViewLayoutInflater之间有什么区别? 我们在自定义inflater的自定义toastsetContentView中使用alertbox的原因是什么?

4 个答案:

答案 0 :(得分:17)

之前你需要了解一些事情,

Android中,每个Activity都附加一个ViewRoot,通常还有一个Window。但是,SurfaceView有自己的窗口。因此,如果Activity有一个SurfaceView,它将拥有多个窗口。

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

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

setContentView(View)是一种专用于Activity的方法。在内部,它会调用setContentView(View)的{​​{1}}。此方法将活动内容设置为显式视图。此视图直接放在活动的视图层次结构中。调用此功能"锁定"从这一点开始,不能改变窗口的各种特性。因此它只被调用一次。

Window用于将布局XML文件实例化为其对应的View对象。基本上,目的是根据需要在运行时创建视图对象。 最好的示例是LayoutInflater,如AdapterViewsListView等,其中根据记录数在运行时创建与单个记录对应的单个视图对象。

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

如果您仔细观察,setView(View)Toast相同。

希望它对你有所帮助。

答案 1 :(得分:2)

setContentView在内部使用Inflater来实现它的功能。这是一种便捷方法,它负责为要膨胀的布局分配父/根视图元素。它还初始化了ActionBar。

这是Android源代码: Activity.java

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
    initActionBar();
}

COM /机器人/内部/策略/ 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和自定义警报对话框中都使用了inflater。 例如自定义Toast创建:

Toast toast = new Toast(getApplicationContext());
toast.setView(inflater.inflate(R.layout.custom_toast, 
(ViewGroup) findViewById(R.id.toast_layout_root)));

e.g。自定义警报对话框创建:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(inflater.inflate(R.layout.dialog_signin, null));

如果是警报对话框,我们不会为膨胀的布局提供根目录,因为布局会添加到带有ID' custom'的FrameLayout元素中。在alert_dialog.xml

中指定

答案 2 :(得分:1)

setContentView ()通常用于加载活动。 inflate只有Layout形成了一个视图类对象,如有必要,还会形成setContentView(view)。 显示了通过setContentView ()界面的常规活动,但如何控制布局设置为在非活动中运行,这需要LayoutInflater动态加载。例如,当您使用适配器类进行微调器时,您可能必须使用LayoutInflater

答案 3 :(得分:1)

setContentView():此方法设置背景布局。

LoayoutInflater:假设您使用listview并且您的需要显示列表10 item.then layoutIflat为show 10 item工作

inflater:这需要你的设计,保持价值 layoutInflat

自定义Toast:这是你的字符串output.custom toast意味着你希望设计output.stylist输出显示。

抱歉兄弟我也不知道alertbox。谢谢你变化很多