setContentView 和 LayoutInflater 有啥区别?

Posted

技术标签:

【中文标题】setContentView 和 LayoutInflater 有啥区别?【英文标题】:What is the difference between setContentView and LayoutInflater?setContentView 和 LayoutInflater 有什么区别? 【发布时间】:2013-07-22 09:41:51 【问题描述】:

我正在创建一个包含多个片段的选项卡列表。 我注意到,在主要活动中,我使用setContentView 获取布局xml,并使用findViewById 获取相应的UI 元素配置。

setContentView(R.layout.fragment_tabs);
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabManager = new TabManager(this, mTabHost, android.R.id.tabcontent);

但是,在不同的片段类中,我必须改用充气器。

View v = inflater.inflate(R.layout.webview, container, false);
WebView myBrowser=(WebView)v.findViewById(R.id.mybrowser);

而且这两个函数都是用来获取布局xml来创建对象的,为什么会有区别呢?第一个是在onCreate 期间使用,第二个是在onCreateView 期间使用吗?在什么情况下我应该选择其中之一?

【问题讨论】:

其实setContentView内部使用LayoutInflator。您不能在调用setContentView 之前调用findViewById,因为视图尚未膨胀。 【参考方案1】:

setContentView 仅是 Activity 方法。每个Activity 都有一个FrameLayout,id 为"@+id/content"(即内容视图)。无论您在setContentView 中指定什么视图,都将是该Activity 的视图。请注意,您还可以将视图的实例传递给此方法,例如setContentView(new WebView(this));您使用的方法版本将在幕后为您放大视图。

另一方面,片段有一个名为onCreateView 的生命周期方法,它返回一个视图(如果有的话)。最常见的方法是在 XML 中扩展视图并在此方法中返回它。在这种情况下,您需要自己充气。片段没有setContentView 方法

Activity 和 View 都有一个名为 findViewById() 的方法。活动版本将在其内容视图中搜索具有给定 ID 的视图(因此,在内部,它将调用 contentView.findViewById())。这意味着需要设置 contentView 才能使用它。像 setContentView 一样,片段不'没有findViewById 的方法(这是有道理的,因为没有内容视图)。只需使用getView().findViewById() 来代替相同的行为。

LayoutInflater.inflate 只是膨胀并返回一个视图(你可以在任何地方使用它)。您仍然需要将该视图设置为 Activity 中的内容视图

【讨论】:

感谢您的回答,另外,是否有必要在findViewById之前获取xml文件并为其创建一个对象?因为我在官方文档中发现了一些例子,所以不是。例如EditText editText = (EditText) findViewById(R.id.email_address);

以上是关于setContentView 和 LayoutInflater 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

`DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有啥区别

关于 setContentView 的说明

如何在片段而不是活动中使用 setContentView

android setContentView()源码解析

android setContentView()源码解析

findViewById 返回 null - Android - setContentView