setContentView和LayoutInflater有什么区别?

use*_*104 25 layout android xml-parsing android-lifecycle layout-inflater

我正在创建一个包含多个片段的选项卡列表.我注意到,在主要活动中,我曾经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);
Run Code Online (Sandbox Code Playgroud)

但是,在不同的片段类中,我必须使用inflater.

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

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

Bra*_*ell 28

setContentView只是一种Activity方法.每个Activity都提供有FrameLayoutid "@+id/content"(即内容视图).您指定的任何视图都setContentView将是对此的观点Activity.请注意,您还可以将视图实例传递给此方法,例如setContentView(new WebView(this));,您正在使用的方法版本将在后台为您的视图充气.

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

  • 我不确定我完全理解这个问题,所以如果我的答案没有意义,请随时再问.活动和视图都有一个名为findViewById()的方法.活动版本将在其内容视图中搜索具有给定id的视图(因此,在内部,它将调用contentView.findViewById()).这意味着需要在contentView变得可用之前设置它.像"setContentView"一样,片段没有"findViewById"的方法(这是有道理的,因为没有内容视图).只需使用getView().findViewById()代替相同的行为. (4认同)
  • LayoutInflater.inflate只是膨胀并返回一个视图(你可以在任何地方使用它).您仍然需要将该视图设置为活动中的内容视图. (2认同)