26

我正在创建一个包含几个片段的选项卡列表。我注意到,在主要活动中,我曾经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);

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

4

1 回答 1

38

setContentView只是一种Activity方法。每个Activity都提供了一个FrameLayout带有 id"@+id/content"的(即内容视图)。您指定的任何视图都setContentView将是该视图Activity。请注意,您还可以将视图的实例传递给此方法,例如setContentView(new WebView(this));,您正在使用的方法版本将在幕后为您放大视图。

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

活动和视图都有一个名为 的方法findViewById()。活动版本将在其内容视图内搜索具有给定 id 的视图(因此,在内部,它将调用contentView.findViewById())。这意味着 contentView 需要在它变得可用之前进行设置。setContentView就像findViewById(这是有道理的,因为没有内容视图。)只需使用getView().findViewById()相同的行为代替。

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

于 2013-07-23T11:05:54.700 回答