FindViewById (int) возвращает значение null для пользовательских представлений, но не встроенные в Android

Ситуация: у меня есть некоторые пользовательские компоненты в моем макете. У меня есть общий макет компоновки, который я загружаю в onCreate() базового класса onCreate() , а затем загружаю макеты контента в мои реализации с помощью надувного устройства, устанавливая корень в столбец содержимого основного макета.

Проблема. Когда я получаю ссылку на представления, чтобы фактически извлечь вход пользователя, Activity.findViewById() возвращает значение null . Возможно, это ключ к тому, что CheckBox и Button I в макете НЕ возвращают null ; Я получаю действительную ссылку на виджет.

Вещи, которые я пробовал: я знаю, что правильно загружаю и раздуваю макет xml, потому что все появляется, а стандартные представления в одном макете можно найти по ID. Я могу взаимодействовать с моими представлениями и помещать контент в них и все, но я не могу получить ссылку на них в своем коде.

Я пробовал очистить проект несколько раз. R.id является свежим и современным.

Я проверил Консоль и Журнал ошибок, и нет сообщений об ошибках UI / XML.

Я попытался получить дескриптор корневого макета содержимого, загруженного для этого действия, и вызвать View.findViewById() чтобы получить мои ссылки, а также возвращает null . Если я рассмотрю макет в отладчике, я могу развернуть его и найти в mChildren .

Возможно, еще одна подсказка:

 public VideoChooser(Context pCtxt, AttributeSet pAttrs) { super(pCtxt, pAttrs); Log.d("VideoChooser", "Expected ID: " + R.id.vchShareVids + " | actual: " + getId()); } 

Приведет к следующему результату:

DEBUG/VideoChooser(10372): Expected ID: 2131296271 | actual: 268435456

Идентификатор, присвоенный представлению, не соответствует идентификатору в R.id ! Почему это так? Я знаю, что он загружает атрибут android:id , иначе он будет -1 ( View.NO_ID ).

Общая компоновка:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:foo="http://schemas.android.com/apk/res/com.foo" android:id="@+id/common_frame" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- top banner --> <LinearLayout android:id="@+id/frame_header" android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_marginBottom="16dp"> <ImageView android:src="@drawable/banner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_weight="1" /> </LinearLayout> <!-- content column --> <LinearLayout android:id="@+id/frame_content" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="32dp" android:layout_marginRight="32dp" /> </LinearLayout> 

Макет контента:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:foo="http://schemas.android.com/apk/res/com.foo" android:id="@+id/content_panel" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.foo.view.VideoChooser android:id="@+id/vchShareVids" foo:prompt_text="@string/prompt_share_vid" foo:prompt_size="16dp" foo:preview_height="80dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="12dp" android:hapticFeedbackEnabled="true" /> <com.foo.view.ContactChooser android:id="@+id/cchRecipients" foo:prompt_text="@string/prompt_share_email" foo:prompt_size="16dp" foo:preview_lines="3" foo:dialog_title="Pretend you are picking contacts" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="12dp" android:hapticFeedbackEnabled="true" /> <com.foo.view.TextChooser android:id="@+id/tchDescription" foo:prompt_text="@string/prompt_share_description" foo:prompt_size="16dp" foo:preview_lines="1" foo:dialog_title="@string/title_msg_chooser_dlg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="12dp" android:hapticFeedbackEnabled="true" /> <CheckBox android:id="@+id/chkReshare" android:text="@string/prompt_reshare" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:hapticFeedbackEnabled="true" /> <Button android:id="@+id/btnSend" android:text="@string/btn_send" android:layout_width="@dimen/btn_width" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:hapticFeedbackEnabled="true" /> </LinearLayout> 

Класс активности Base onCreate ():

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

Реализация активности onCreate ():

 @Override protected void onCreate(Bundle pState) { super.onCreate(pState); load_content_view(R.layout.content_layout); ViewGroup tLayout = (ViewGroup)findViewById(R.id.content_panel); // These all return null mCchVideo = (ContentChooser)tLayout.findViewById(R.id.vchShareVids); mCchContact = (ContentChooser)tLayout.findViewById(R.id.cchRecipients); mCchDescription = (ContentChooser)tLayout.findViewById(R.id.tchDescription); // These return valid references mChkReshare = (CheckBox)findViewById(R.id.chkReshare); mBtnSend = (Button)findViewById(R.id.btnSend); // ... } protected void load_content_view(int pResId) { LinearLayout tColumn = (LinearLayout)findViewById(R.id.frame_content); getLayoutInflater().inflate(pResId, tColumn); } 

У меня была аналогичная проблема, и решение для моего было удостовериться, что конструктор пользовательского виджета вызывает

 super(context, attrs); 

Мой конструктор не передал attrs супер, и поэтому идентификатор вида был испорчен, и findviewbyId вернул значение null.

Очень трудно найти проблему без реальных источников. Я создал образец проекта на основе ваших сообщений и его полностью работает. Я считаю, что есть очень простая ошибка, и вы ее найдете. Если вы хотите, вы можете попробовать

Да … Я идиот. Разумеется, просмотр был настроен на правильный идентификатор, а затем один из моих методов init вернулся и скрепил его.

Facepalm