Описывает ли /res/layout/main.xml View или ViewGroup? - PullRequest
2 голосов
/ 27 июля 2010

Мой 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 Ответ

6 голосов
/ 27 июля 2010

findViewById должен принимать идентификатор представления, определенного внутри XML-файла макета, а не идентификатор самого файла.После того, как вы надули представление, вручную или через 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 .После этого вы сможете безопасно преобразовать результат в ViewGroup или LinearLayout.

Если по какой-то случайности вы хотите загрузить основной вид отдельно, например, как подпредставление, используйте getLayoutInflater(). inflate(...) для создания и извлечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...