findViewById возвращает ноль при просмотре <include> - PullRequest
11 голосов
/ 16 декабря 2011

Давайте перейдем прямо к коду.

Код действия, метод onCreate

setContentView(R.layout.main);

View main_view = findViewById(R.id.main_view);
View view_flipper = main_view.findViewById(R.id.vf);
View first_tab = view_flipper.findViewById(R.id.prev_pane);

Код макета main.xml:

<ViewFlipper android:id="@+id/vf"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >  

    <include android:id="@+id/prev_pane" layout="@layout/vf_inner" /> 
<include android:id="@+id/cur_pane" layout="@layout/vf_inner" />
    <include android:id="@+id/next_pane" layout="@layout/vf_inner" />
</ViewFlipper>

Проблема!Главный вид найден правильно, так же как и ViewFlipper, но prev_pane, cur_pane или next_pane не найдены, возвращается нулевой указатель.Есть идеи, почему?

Это действие вызывается через вкладку с помощью намерения.Все ссылки разрешены правильно, кроме идентификаторов на include

Когда я проверяю переменные, я нахожу содержимое макета vf_inner в mChildren

Ответы [ 2 ]

8 голосов
/ 16 декабря 2011

Это потому, что теги <include /> не являются реальным представлением в вашей иерархии пользовательского интерфейса.Они являются скорее инструкцией копирования и вставки для инструментов Android.

Если вы хотите найти панели во время выполнения, добавьте идентификаторы в корневые элементы включенных макетов.Таким образом, их можно найти через findViewById().

0 голосов
/ 16 декабря 2011

Одна вещь, которую вы можете сделать, это обернуть операторы <include> внутри родительского макета (который все еще является дочерним по отношению к вашему основному родительскому макету). Дайте этим представлениям разные идентификаторы, чтобы вы могли findViewById каждый из них в отдельности.

...