【问题标题】:what happens when a view id is used for setContentView()当视图 id 用于 setContentView() 时会发生什么
【发布时间】:2014-03-04 02:47:57
【问题描述】:

Android 开发人员指南似乎建议只能使用布局 ID (R.layout.*) 调用 Activity.setContentView()。但是,我可以看到视图 ID (R.id.*) 用于调用该方法。比如在XBMC的org/xbmc/android/widget/slidingtabs/SlidingTabActivity.java中可以看到如下代码:

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

那么,使用视图 ID 调用 setContentView() 是什么意思?谢谢!

基于评论的附加问题 - “setContentView(viewId);”是否等同于“View v = findViewById(viewId); setContentView(v);”?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    不是

    Activity.setContentView() 只能使用布局 ID (R.layout.) 调用

    setContentView() 可以调用任何视图 ID。

    而且布局也是一种视图!

    【讨论】:

    • 我可以猜到代码可能会做什么,但根据 Android 开发人员指南,似乎不允许(或至少不鼓励)这样做。那么,“setContentView(viewId)”是否等同于“View v = findViewById(viewId); setContentView(v);”?谢谢!
    • 是的,你明白了。 setContentView 方法重载,setContentView(int)和setContentView(View)都可以。
    • 那么,您有 setContentView(int) 实现的源代码示例吗?或者,这方面的文档?
    • 我觉得官方文档就够了。 developer.android.com/reference/android/app/…
    • 官方文档暗示“setContentView(R.layout.my_layout)”会膨胀my_layout.xml。那么,它在哪里说明“setContentView(R.id.my_view)”会发生什么? id my_view 属于哪个xml文件,应该膨胀哪个xml文件?
    【解决方案2】:

    我认为文档应该说:从视图(不仅仅是布局)资源中设置活动内容。资源将被膨胀,将所有顶级视图添加到活动中。实际上,它是这样工作的:如果你制作一个 setConentView(R.layout.my_layout);那么android os会做以下工作:

    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);  ` 
    

    所以我说它们是一样的。

    【讨论】:

    • 非常感谢您挖掘代码并在此处显示。但是,如果仅提供视图 ID,Android 操作系统如何确定要膨胀的 xml。 LayoutInflater.inflate() 的文档说“从指定的 xml 资源膨胀新的视图层次结构”。那么,xml资源是如何指定的呢?
    • 如果你查看 LayoutInflater.inflate(int,...) 的源代码,你会看到“XmlResourceParser parser = getContext().getResources().getLayout(resource);”,和稍后的解析器用于调用 inflate(XmlResourceParser,...)。 getLayout(int) 所做的是“loadXmlResourceParser(id, "layout");”。因此,代码假设传入了一个布局 id。
    • 你有一个包含所有这些信息的 R.java 文件,Android OS 可以确定你应该从中扩展哪个 xml 和哪个视图。
    • 我同意一切都在那里,但问题是 - 我找不到实现逻辑的代码。
    • 所有这些逻辑都深藏在Android源码中,难以言说。只要看看ActivityManagerService和PackageManagerService的源码就知道了。
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2013-09-08
    相关资源
    最近更新 更多