Android 这种NPE的原因是什么?

Android 这种NPE的原因是什么?,android,nullpointerexception,android-tablayout,Android,Nullpointerexception,Android Tablayout,首先,让我们把事情弄清楚。NPE通常发生在null元素被赋值时。有趣的是,这不是这里发生的事情,但我仍然得到了NPE,我不确定这里到底出了什么问题 在我的MainActivity中有一个简单的tabLayout,它甚至还没有连接到任何片段。我初始化并设置如下: ViewPager viewPager = new ViewPager(this); TabLayout tabLayout = findViewById(R.id.tabsLayout); tabLayout.setupWithView

首先,让我们把事情弄清楚。NPE通常发生在null元素被赋值时。有趣的是,这不是这里发生的事情,但我仍然得到了NPE,我不确定这里到底出了什么问题

在我的
MainActivity
中有一个简单的
tabLayout
,它甚至还没有连接到任何片段。我初始化并设置如下:

ViewPager viewPager = new ViewPager(this);
TabLayout tabLayout = findViewById(R.id.tabsLayout);
tabLayout.setupWithViewPager(viewPager);
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))));
然后我使用自定义方法设置每个选项卡的
视图
s,如下所示:

ViewPager viewPager = new ViewPager(this);
TabLayout tabLayout = findViewById(R.id.tabsLayout);
tabLayout.setupWithViewPager(viewPager);
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时,它为什么是空的?我肯定错过了一些东西,但不知道到底是什么

当我在上面两行设置imageView时,它为什么是空的

findViewById()
如果在布局层次结构中找不到视图,则返回null


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

mainView.findViewById()
将解决您的问题,但当然!我正在调用
findViewById()
而没有说明它应该从哪个
View
获取id,因此它从
MainActivity
视图获取id,而不是从
mainView
获取id。非常感谢。