2014-03-04 15 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

相关问题