2014-03-04 43 views
1

時發生了什麼Android開發人員指南似乎暗示只能使用佈局ID(R.layout。*)調用Activity.setContentView()。但是,我可以看到用於調用方法的視圖ID(R.id. *)。例如,在組織/ XBMC /安卓/空間/ slidingtabs/XBMC的SlidingTabActivity.java,我可以看到下面的代碼:將視圖ID用於setContentView()

private void ensureTabHost() { 
    if (mTabHost == null) { 
     this.setContentView(R.id.slidingtabhost); 
    } 
} 

那麼,這是什麼意思調用的setContentView(),以期ID?謝謝!

基於評論的其他問題 - 是「setContentView(viewId);」相當於「View v = findViewById(viewId); setContentView(v);」?

回答

0

該Activity.setContentView()只能與佈局ID被調用(R.layout。)

只要任何視圖id可通過的setContentView被調用()。

而佈局也是一個視圖!

+0

我可以猜測代碼可能會做什麼,但根據Android開發人員指南,它似乎不被允許(或至少鼓勵)。所以,「setContentView(viewId)」等價於「View v = findViewById(viewId); setContentView(v);」?謝謝! – dacongy

+0

是的,你明白了。 setContentView方法被重載,setContentView(int)和setContentView(View)都可以。 – tianwei

+0

那麼,你有一個setContentView(int)實現的源代碼示例嗎?或者,這個文件? – dacongy

0

我認爲文檔應該說:從視圖(不僅是佈局)資源設置活動內容。資源將被誇大,將所有頂級視圖添加到活動中。實際上,它的工作原理是這樣的:如果你創建一個setConentView(R.layout.my_layout);那麼Android操作系統將做以下工作:

LayoutInflater inflater= (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

View layout = inflater.inflate(R.layout.my_layout, null); 
setConentView(layout); 

,如果你做的setContentView(R.id.myview),它也是以同樣的方式膨脹。

LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


View myview = inflater.inflate(R.id.myview, null); 
setConentView(myview); ` 

所以我說他們是一樣的。

+0

非常感謝您挖掘代碼並在此處顯示。但是,如果僅提供視圖標識,Android OS如何確定哪個xml充氣。 LayoutInflater.inflate()的文檔顯示「從指定的xml資源中填充新的視圖層次結構」。那麼,如何指定xml資源? – dacongy

+0

如果您查看LayoutInflater.inflate(int,...)的源代碼,您將看到「XmlResourceParser parser = getContext()。getResources()。getLayout(resource);」,後面的解析器用於調用inflate (XmlResourceParser,...)。 getLayout(int)所做的是「loadXmlResourceParser(id,」layout「);」。因此,代碼假設傳入了一個佈局ID。 – dacongy

+0

您有一個包含所有這些信息的R.java文件,Android OS可以找出哪個xml以及您應該從哪個視圖膨脹。 – tianwei

相關問題