В чем причина этого НПЭ?

Во-первых, давайте проясним ситуацию. NPE обычно происходит, когда нулевому элементу присваивается значение. Как ни странно, здесь этого не происходит, но я все еще получаю NPE, и я не уверен, что именно здесь происходит.

У меня в tabLayout есть простой MainActivity, который еще даже не зацеплен ни с какими фрагментами. Я инициализирую и настраиваю так:

ViewPager viewPager = new ViewPager(this);
TabLayout tabLayout = findViewById(R.id.tabsLayout);
tabLayout.setupWithViewPager(viewPager);

Затем я использую собственный метод, чтобы установить View для каждой вкладки следующим образом:

tabLayout.addTab(tabLayout.newTab().setCustomView(initTabView(getResources().getDrawable(R.drawable.baseline_explore_black_18dp),
            getResources().getString(R.string.tab_map))), true);
tabLayout.addTab(tabLayout.newTab().setCustomView(initTabView(getResources().getDrawable(R.drawable.baseline_perm_identity_black_18dp),
            getResources().getString(R.string.tab_profile))));
tabLayout.addTab(tabLayout.newTab().setCustomView(initTabView(getResources().getDrawable(R.drawable.baseline_loyalty_black_18dp),
            getResources().getString(R.string.tab_offers))));
tabLayout.addTab(tabLayout.newTab().setCustomView(initTabView(getResources().getDrawable(R.drawable.qr_code_icon),
            getResources().getString(R.string.tab_scanner))));

А вот метод:

private View initTabView(Drawable tabIcon, String tabText) {
    View mainView = getLayoutInflater().inflate(R.layout.tab_layout, null);
    ImageView tabImageView = findViewById(R.id.tab_icon);
    TextView tabTextView = findViewById(R.id.tab_text);
    tabImageView.setImageDrawable(tabIcon);
    tabTextView.setText(tabText);
    return mainView;
}

Я получаю NPE в этой строке: tabImageView.setImageDrawable(tabIcon);, говоря, что он пытается вызвать метод setImageDrawable для ссылки на нулевой объект. Почему imageView имеет значение null, когда я установил его двумя строками выше? Я определенно что-то здесь упускаю, но не знаю, что именно.

mainView.findViewById() решит вашу проблему
Zeeshan Shabbir 29.07.2018 12:05
2
1
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

How come the imageView is null, when I set it up two lines above?

findViewById() возвращает ноль, если представление не было найдено в иерархии макета.

Вы, вероятно, захотите вызвать mainView.findViewById() для поиска только что раздутой иерархии представлений вместо иерархии представлений активности.

Но конечно! Я звоню findViewById(), не уточняя, от какого View он должен получить идентификатор, поэтому он получает его из представления MainActivity вместо mainView. Спасибо!

Noterezeck 29.07.2018 12:08

Другие вопросы по теме