这种NPE的原因是什么?

时间:2018-07-29 09:54:44

标签: android nullpointerexception android-tablayout

首先,让我们弄清楚。 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?我肯定在这里遗漏了一些东西,但不知道到底是什么。

1 个答案:

答案 0 :(得分:1)

  

当我在上面两行设置imageView时,为什么它为null?

如果在布局层次结构中找不到该视图,则

findViewById()返回null。

您可能想调用mainView.findViewById()来搜索刚刚膨胀的视图层次结构,而不是活动视图层次结构。