18

我正在創建一個包含多個片段的選項卡列表。 我注意到,在主要活動中,我使用setContentView來獲取佈局xml並使用findViewById來獲取相應的UI元素配置。setContentView和LayoutInflater之間的差異

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

但是,在不同的片段類中,我必須改用inflater。

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

而且這兩個函數都用來獲取佈局xml來創建一個對象,爲什麼會有區別?第一個在onCreate期間使用,第二個在onCreateView期間使用?在什麼情況下我應該選擇他們中的任何一個?

回答

22

setContentView僅爲Activity方法。每個Activity提供有具有id(即內容視圖)的FrameLayout。無論您在setContentView中指定的任何視圖都是該視圖的Activity。請注意,您也可以將視圖實例傳遞給此方法,例如setContentView(new WebView(this));您正在使用的方法版本將在幕後爲您展開視圖。

另一方面,片段有一個名爲onCreateView的生命週期方法,它返回一個視圖(如果它有一個)。這樣做的最常見方法是用XML填充視圖並以此方法返回。在這種情況下,你需要自己膨脹它。片段沒有setContentView方法

+0

感謝您的回答,是否有必要在findViewById之前獲取xml文件併爲其創建對象?因爲我在官方文檔中發現了一些例子。例如EditText editText =(EditText)findViewById(R.id.email_address); – user782104

+4

我不確定我完全理解了這個問題,所以如果我的回答沒有意義,請隨時再次提問。活動和視圖都有一個名爲findViewById()的方法。活動版本將在其內容視圖內搜索具有給定id的視圖(因此,在內部它將調用contentView.findViewById())。這意味着contentView需要在可用之前進行設置。像「setContentView」一樣,片段沒有「findViewById」的方法(這是合理的,因爲沒有內容視圖)。只需使用getView()。findViewById()來代替相同的行爲。 –

+0

您沒有提到可以在Activity中使用'LayoutInflater.inflate',作爲'setContentView'的替代方法。 –