findViewByID возвращает ноль - PullRequest
233 голосов
/ 16 июля 2010

Прежде всего: да, я читаю все остальные темы по этой теме.И не только с этого сайта ... (видите, я немного расстроен)

Большинство из них приходят с рекомендацией использовать 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.

Затем я изменил свой пользовательский вид, чтобы вместо него расширить ViewGroupView и изменил location_layout.xml, чтобы TextView был прямым потомком моего пользовательского представления, чтобы View.findViewById работал так, как предполагалось.Сюрприз: это ничего не решило.

Так какого чёрта я делаю не так?

Буду благодарен за любые комментарии.

Ответы [ 28 ]

0 голосов
/ 27 июля 2018

В моем случае findViewById возвратил ноль, когда я переместил вызов из родительского объекта в объект адаптера, созданный родителем.После безуспешных попыток, перечисленных здесь, я переместил findViewById обратно в родительский объект и передал результат в качестве параметра во время создания объекта адаптера.Например, я сделал это в родительском объекте:

 Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);

Затем я передал hdSpinner как параметр при создании объекта адаптера:

  mTransactionAdapter = new TransactionAdapter(getActivity(),
        R.layout.transactions_list_item, null, from, to, 0, hdSpinner);
0 голосов
/ 06 октября 2017

Я попробовал все вышеперечисленное, ничего не получалось ... поэтому мне пришлось сделать ImageView статическим public static ImageView texture;, а затем texture = (ImageView) findViewById(R.id.texture_back);, хотя я не думаю, что это хороший подход это действительно сработало для моего случая :)

0 голосов
/ 27 октября 2016

findViewById также может возвращать ноль, если вы находитесь внутри фрагмента. Как описано здесь: findViewById во фрагменте

Вы должны вызвать getView (), чтобы вернуть View верхнего уровня внутри фрагмента. Затем вы можете найти элементы макета (кнопки, текстовые представления и т. Д.)

0 голосов
/ 24 октября 2015

НАДУВАТЬ ПЛАН !! (который содержит идентификатор)

В моем случае findViewById () вернул null, потому что макет, в котором был написан элемент, не был раздут

Например. fragment_layout.xml

<ListView
android:id="@+id/listview">

findViewById (R.id.listview) возвратил ноль, потому что я не сделал inflater.inflate (R.layout.fragment_layout, ..., ...); до этого.

Надеюсь, этот ответ поможет некоторым из вас.

0 голосов
/ 11 апреля 2014

По моему опыту, это также может происходить, когда ваш код вызывается после OnDestroyView (когда фрагмент находится в заднем стеке). Если вы обновляете пользовательский интерфейс при вводе из BroadCastReceiver, вам следует проверить, не является ли это это дело.

0 голосов
/ 13 декабря 2018

Сбой для меня, потому что одно из полей в идентификаторе моей активности совпадает с идентификатором в другой активности.Я исправил это, указав уникальный идентификатор.

В поле ввода пароля loginActivity.xml идентификатор был "пароль".В своей регистрационной активности я просто исправил это, указав идентификатор r_password, затем он вернул ненулевой объект:

password = (EditText)findViewById(R.id.r_password);
0 голосов
/ 13 марта 2019

Я столкнулся с подобной проблемой, когда пытался создать пользовательское представление для ListView.

Я решил это просто так:

public View getView(int i, View view, ViewGroup viewGroup) {

    // Gets the inflater
    LayoutInflater inflater = LayoutInflater.from(this.contexto);

    // Inflates the layout
    ConstraintLayout cl2 = (ConstraintLayout) 
    inflater.inflate(R.layout.custom_list_view, viewGroup, false);

    //Insted of calling just findViewById, I call de cl2.findViewById method. cl2 is the layout I have just inflated. 
     TextView tv1 = (TextView)cl2.findViewById(cl2);
0 голосов
/ 24 мая 2016

Моим решением было просто очистить проект.

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