/res/layout/main.xml是描述View还是ViewGroup?

时间:2010-07-27 02:58:20

标签: java android layout view

我的main.xml看起来像这样:

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

由于根元素是LinearLayout,其扩展为ViewGroup,为什么main.xml会变成View而不是ViewGroup?例如,在我的主要Activity课程中,我尝试获取LinearLayout包含的子视图的数量,如下所示:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ViewGroup vg = (ViewGroup) findViewById(R.layout.main);
    Log.v("myTag", "num children: " + vg.getChildCount());

但是当我拨打vg.getChildCount()时,它会崩溃。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

findViewById应该将布局XML文件中定义在内的视图的ID,而不是文件本身的ID。一旦您通过手动或通过setContentView对视图进行了充气,​​您可以使用它来获取布局,如果您这样做的话:

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

人:

ViewGroup vg = (ViewGroup) findViewById(R.id.mainlayout);

请注意添加android:id属性并在R.id调用中使用匹配的findViewById值。它与Dev Guide中描述的用法相同。然后,您应该能够将结果安全地转换为ViewGroupLinearLayout

如果您希望单独加载主视图,例如作为子视图,使用getLayoutInflater()inflate(...)来构建和检索它。