Прежде всего: да, я прочитал все другие темы на эту тему. И не только с этого сайта ... (видишь, я немного расстроен)
Большинство из них приходят с советами, чтобы использовать android:id
вместо просто id
в файле XML. Я сделал.
От других я узнал, что View.findViewById
работает иначе, чем Activity.findViewById
. Я тоже с этим справился.
По моему location_layout.xml
я использую:
<FrameLayout .... >
<some.package.MyCustomView ... />
<LinearLayout ... >
<TextView ...
android:id="@+id/txtLat" />
...
</LinearLayout>
</FrameLayout>
В своей деятельности я делаю:
...
setContentView( R.layout.location_layout );
и в моем классе пользовательского представления:
...
TextView tv = (TextView) findViewById( R.id.txtLat );
который возвращается null
. Делая это, моя активность работает нормально. Так может быть , это из-за Activity.findViewById
и View.findViewById
различия. Поэтому я сохранил контекст, переданный конструктору представления таможни локально, и попытался:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
который также вернулся null
.
Затем я изменил свой пользовательский вид, чтобы расширить ViewGroup
вместо этого View
и изменил, location_layout.xml
чтобы позволитьTextView
быть прямым потомком моего пользовательского вида, чтобы он View.findViewById
работал так, как предполагалось. Сюрприз: это ничего не решило.
Так какого чёрта я делаю не так?
Я буду благодарен за любые комментарии.
источник
Ответы:
Возможно, потому что вы звоните слишком рано. Подожди пока
onFinishInflate()
. Вот пример проекта, демонстрирующего пользовательскийView
доступ к его содержимому.источник
onFinishInflate()
.Возможно, вы звоните
findViewById
до звонкаsetContentView
? Если это так, попробуйте позвонитьfindViewById
ПОСЛЕ вызоваsetContentView
источник
Убедитесь, что у вас нет нескольких версий макета для разных плотностей экрана. Я столкнулся с этой проблемой один раз при добавлении нового идентификатора в существующий макет, но забыл обновить версию hdpi. Если вы забудете обновить все версии файла макета, он будет работать для некоторых плотностей экрана, но не для других.
источник
FindViewById может быть нулевым, если вы вызываете неправильный супер-конструктор в пользовательском представлении. Идентификационный тег является частью attrs, поэтому, если вы игнорируете attrs, вы удаляете этот идентификатор.
Это было бы неправильно
Это верно
источник
В моем случае у меня было 2 актива в моем проекте,
main.xml
иmain2.xml
. С самого начала,main2
была копияmain
, и все работало хорошо, пока я не добавил новыйTextView
дляmain2
, поэтомуR.id.textview1
стали доступны для остальной части приложения. Затем я попытался получить его стандартным вызовом:и это всегда было нулевым. Оказалось, что в
onCreate
конструкторе я выполнял не экземплярmain2
, а другой. Я имел:вместо того
Я заметил это после того, как приехал сюда, на сайт.
источник
Наряду с классическими причинами, упомянутыми в другом месте:
setContentView()
раньшеfindViewById()
id
вы хотите, чтобы в представлении или макете вы далиsetContentView()
id
не случайно дублируется в разных макетахЯ нашел один для пользовательских представлений в стандартных макетах, что противоречит документации:
Теоретически вы можете создать собственный вид и добавить его в макет ( см. Здесь ). Однако я обнаружил, что в таких ситуациях иногда
id
атрибут работает для всех представлений в макете, кроме пользовательских. Решение, которое я использую:FrameLayout
те же свойства макета, которые вы хотели бы иметь в пользовательском представлении. Дайте ему соответствующееid
, скажемframe_for_custom_view
.В
onCreate
:который помещает пользовательский вид в рамку.
источник
источник
Ответ для тех, кто использует ExpandableListView и сталкиваются с этим вопросом, основываясь на его названии.
Я имел эту ошибку при попытке работать с TextViews в моем дочернем и групповом представлениях как часть реализации ExpandableListView.
Вы можете использовать что-то вроде следующего в ваших реализациях методов getChildView () и getGroupView ().
Я нашел это здесь .
источник
Я довольно новичок в Android / Eclipse, по ошибке я добавил материал для интерфейса
activity_main.xml
вместоfragment_main.xml
. Мне понадобилось несколько часов, чтобы понять это ...источник
FWIW, я не вижу, чтобы кто-то решил это так же, как мне было нужно. Никаких жалоб во время компиляции, но я получал нулевое представление во время выполнения и вызывал вещи в правильном порядке. То есть findViewById () после setContentView (). Проблема оказалась в том, что мое представление определено в content_main.xml, но в моем activity_main.xml мне не хватало одного этого утверждения:
Когда я добавил это в activity_main.xml, больше не было NullPointer.
источник
У меня была такая же проблема. Я использовал стороннюю библиотеку, которая позволяет переопределить их адаптер для GridView и указать свой собственный макет для каждой ячейки GridView.
Я наконец понял, что происходит. Eclipse все еще использовал XML-файл макета библиотеки для каждой ячейки в GridView, хотя и не дал никаких указаний на это. В моем собственном адаптере он указывал, что он использовал ресурс xml из моего собственного проекта, хотя во время выполнения этого не было.
Поэтому я убедился, что мои пользовательские макеты и идентификаторы XML отличаются от тех, которые все еще находятся в библиотеке, очистили проект, а затем он начал читать правильные пользовательские макеты, которые были в моем проекте.
Короче говоря, будьте осторожны, если вы переопределяете адаптер сторонней библиотеки и указываете свой собственный XML-формат для использования адаптером. Если ваш макет внутри вашего проекта имеет то же имя файла, что и в библиотеке, вы можете столкнуться с действительно трудной для поиска ошибкой!
источник
В моем конкретном случае я пытался добавить нижний колонтитул в ListView. Следующий вызов в onCreate () возвращал ноль.
Изменение этого значения для надувания представления нижнего колонтитула вместо поиска по идентификатору решило эту проблему.
источник
В моем случае я использовал ExpandableListView, и я установил
android:transcriptMode="normal"
. Это приводило к исчезновению нескольких детей в расширяемой группе, и я получал исключение NULL, когда использовал прокрутку списка.источник
Для меня у меня было два xml-макета для одной и той же деятельности - одна в портретном режиме и одна в альбомной. Конечно, я изменил идентификатор объекта в xml ландшафта, но забыл сделать то же самое изменение в портретной версии. Удостоверьтесь, что если вы замените один, вы сделаете то же самое на другой xml, иначе вы не получите сообщение об ошибке, пока не запустите / отладите его и не сможете найти идентификатор, который вы не изменили. О глупые ошибки, почему вы меня так наказываете?
источник
Установите содержание деятельности из ресурса макета. то есть.
setContentView(R.layout.basicXml)
;источник
В дополнение к вышеупомянутым решениям вы убедитесь, что
tools:context=".TakeMultipleImages"
в макете то же значение в файле mainfest.xml:android:name=".TakeMultipleImages"
для того же элемента действия. это происходит при использовании копирования и вставки для создания новой деятельностиисточник
У меня та же проблема, но я думаю, что стоит поделиться с вами, ребята. Если вам нужно найти ViewById в пользовательском макете, например:
Вы не можете получить представление в конструкторе. Вы должны вызвать findViewById после того, как представление завышено. Это метод, который вы можете переопределить
onFinishInflate
источник
Просто хотел бросить мой конкретный случай здесь. Может помочь кому-нибудь по линии.
Я использовал директиву в своем XML-интерфейсе Android для Android следующим образом:
Родительский вид:
Детский вид (retry_button):
.findViewById (R.id.retry) всегда будет возвращать ноль. Но если я переместил идентификатор из дочернего представления в тег include, он начал работать.
Фиксированный родитель:
Фиксированный ребенок:
источник
Мой случай не похож на выше, решения не сработали. Я предполагаю, что мое мнение было слишком глубоко в иерархии макетов. Я переместил его на один уровень вверх, и он больше не был нулевым.
источник
В моем случае я раздул макет, но дочерние представления возвращали ноль. Изначально у меня было это:
Однако, когда я изменил его на следующее, это сработало:
Ключ должен был специально ссылаться на уже раздутый макет, чтобы получить дочерние представления. То есть добавить
footerView
:источник
По моему опыту, кажется, что это также может происходить, когда ваш код вызывается после OnDestroyView (когда фрагмент находится в заднем стеке). Если вы обновляете пользовательский интерфейс при вводе из BroadCastReceiver, вам следует проверить, так ли это ,
источник
Надуйте план! (который содержит идентификатор)
В моем случае findViewById () вернул null, потому что макет, в котором был написан элемент, не был раздут ...
Например. fragment_layout.xml
findViewById (R.id.listview) возвратил ноль, потому что я не сделал inflater.inflate (R.layout.fragment_layout, ..., ...); перед этим.
Надеюсь, что этот ответ поможет некоторым из вас.
источник
Мое решение было просто очистить проект.
источник
findViewById также может возвращать ноль, если вы находитесь внутри фрагмента. Как описано здесь: findViewById во фрагменте
Вы должны вызвать getView (), чтобы вернуть View верхнего уровня внутри фрагмента. Затем вы можете найти элементы макета (кнопки, текстовые представления и т. Д.)
источник
Я перепробовал все вышеперечисленное, ничего не получалось .. поэтому мне пришлось сделать свой ImageView статичным,
public static ImageView texture;
а затемtexture = (ImageView) findViewById(R.id.texture_back);
, я не думаю, что это хороший подход, но это действительно работает для моего случаяисточник
В моем случае findViewById вернул null, когда я переместил вызов из родительского объекта в объект адаптера, созданный родителем. После неудачных попыток, перечисленных здесь, я переместил findViewById обратно в родительский объект и передал результат в качестве параметра во время создания объекта адаптера. Например, я сделал это в родительском объекте:
Затем я передал hdSpinner в качестве параметра при создании объекта адаптера:
источник
Сбой произошел из-за того, что одно из полей в идентификаторе моей активности совпадало с идентификатором в другой активности. Я исправил это, дав уникальный идентификатор.
В моем поле логина loginActivity.xml идентификатор был "пароль". В своей регистрационной активности я просто исправил это, указав идентификатор r_password, после чего он вернул ненулевой объект:
источник
Я столкнулся с аналогичной проблемой, когда я пытался сделать пользовательский вид для
ListView
.Я решил это просто так:
источник
Способы отладки и поиска проблемы:
В моем случае я использовал файл activity_main.xml как в модуле приложения, так и в модуле библиотеки. Поэтому, когда я выполнил вышеуказанные шаги, вместо макета, который я разработал в библиотеке, макет внутри модуля приложения был раздут.
Поэтому я изменил имя файла Activity_main.xml на Activity_main_lib.xml.
Поэтому убедитесь, что у вас нет повторяющихся имен макетов во всем вашем проекте .
источник