【问题标题】:When a layout is not explicity declared, what is the default layout for an Activity?如果没有显式声明布局,Activity 的默认布局是什么?
【发布时间】:2012-01-24 11:17:59
【问题描述】:

我用一个 Activity 编写了一个简单的 Hello World 应用程序。

类:

public class HelloWorld extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.helloworld);
    }

}

helloworld.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>

我有所需的资源和“AndroidManifest.xml”,应用程序运行良好。

在“hierarchyviewer”工具的“View Hierarchy window”中,我注意到 TextView 小部件的父级是 FrameLayout,其父级是 LinearLayout(为简洁起见,我只剪切了所需的屏幕截图)。屏幕截图:

在我的“helloworld.xml”中,我没有将 FrameLayout 声明为 TextView 小部件的父级。请帮助我理解:
1. 一般来说,如果布局资源(xml文件)中没有显式声明布局,运行时如何决定布局?
2. 图中为什么LinearLayout是FrameLayout的parent?

非常感谢。

【问题讨论】:

    标签: android android-layout android-activity default


    【解决方案1】:

    在 Vikram Bodicherla 发布的链接的提示和一些努力的帮助下,我找到了问题的答案。 我的问题的答案在于 Android 3.0 版本——“当应用程序安装在运行 Android 3.0 或更高版本的设备上时, 系统将全息主题应用于每个活动,因此,每个活动都包含操作栏。”,来自文档。

    1 一般来说,如果布局资源(xml 文件)中未显式声明布局,运行时如何决定布局?
    - 请参阅下面的答案。

    2 图中为什么LinearLayout是FrameLayout的父级?
    - LineraLayout 将 UI 分为两部分 - 顶部和底部,分别代表 ActionBar 和活动的 UI(组件,除了 ActionBar 组件)分别。底部有 FrameLayout,这是一个适合包含任何布局的布局。所以,如果你这样做 没有在你的布局资源中明确指定任何布局,例如我的(见上文 - helloworld.xml),组件将始终放置 在框架布局中。如果您声明任何布局,例如 GridLayout 甚至是 LinearLayout 或 FrameLayout,它仍将包含在 FrameLayout 中,而 FrameLayout 将包含在 LinearLayout 中。这也解释了为什么“......活动内容视图的父级始终是 FrameLayout”。来自 Vikram Bodicherla 发布的链接。

    @Vikram Bodicherla - 我为你的链接帖子打了分,再次感谢。

    【讨论】:

      【解决方案2】:

      如果未调用设置的内容视图,则在 R.java 中找到的所有视图都将为空。具体来说,这是因为在调用 setContentView(xx) 之前不会创建视图。没有“默认布局”。

      这些是可用于在Activity 中配置布局的选项:

      void     setContentView(int layoutResID)
      Set the activity content from a layout resource.
      
      void     setContentView(View view)
      Set the activity content to an explicit view.
      
      void     setContentView(View view, ViewGroup.LayoutParams params)
      Set the activity content to an explicit view.
      

      在调用这些方法之一时,您会将视图实例化到您的活动中,因此当从 R.java 中检索它们时,它们将是非空的。

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多