【问题标题】:Android: setContentView and LayoutInflaterAndroid:setContentView 和 LayoutInflater
【发布时间】:2014-05-19 03:24:36
【问题描述】:

setContentViewLayoutInflater 有什么区别? 我们在自定义toast 中使用inflater 和在自定义alertbox 中使用setContentView 的原因是什么?

【问题讨论】:

标签: android android-layout


【解决方案1】:

你需要先了解一些事情,

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

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

基本上ViewRoot负责收集和调度输入,View负责管理焦点/按键事件,Canvas只负责使用onDraw()进行“绘图”操作。

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

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

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

如果仔细观察,ToastAlertDialog 相同。

希望对你有帮助。

【讨论】:

  • 确实有帮助,谢谢。但作为一个新手,我需要探索更多。
  • 这样的答案对我来说很少见。谢谢!
【解决方案2】:

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

这里是安卓源代码: 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 和自定义警报对话框中使用了 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 中指定的那样

【讨论】:

    【解决方案3】:

    setContentView () 一般用于加载活动。 inflate只有Layout形成了一个view类对象,必要时再setContentView(view)。 一般activity通过setContentView ()界面显示,但如何控制布局设置为在非activity中操作,需要LayoutInflater动态加载。例如,当您使用适配器类作为微调器时,您可能必须使用LayoutInflater

    【讨论】:

      【解决方案4】:

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

      LoayoutInflater:假设如果您使用 listview 并且您需要显示列表 10 项。那么 layoutIflat 确实适用于显示 10 项

      inflater:你的layout设计需要它,保持价值 布局膨胀

      Custom Toast:这是您的字符串 output.custom toast 表示您希望设计 output.stylist 输出显示的方式。

      对不起兄弟我也不知道alertbox。谢谢你变化很大

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多