这个NPE的原因是什么?
What is the cause of this NPE?
首先,让我们把事情弄清楚。 NPE 通常在为空元素赋值时发生。有趣的是,这不是这里发生的事情,但我仍然得到 NPE,我不确定这里到底出了什么问题。
我的 MainActivity
中有一个简单的 tabLayout
,它甚至还没有与任何片段挂钩。我像这样初始化和设置它:
ViewPager viewPager = new ViewPager(this);
TabLayout tabLayout = findViewById(R.id.tabsLayout);
tabLayout.setupWithViewPager(viewPager);
然后我使用自定义方法设置每个选项卡的 View
s,如下所示:
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 怎么为空?我肯定在这里遗漏了一些东西,但不知道到底是什么。
How come the imageView is null, when I set it up two lines above?
findViewById()
returns 如果在布局层次结构中找不到视图,则为 null。
您可能想调用 mainView.findViewById()
来搜索刚刚膨胀的视图层次结构而不是 activity 视图层次结构。
首先,让我们把事情弄清楚。 NPE 通常在为空元素赋值时发生。有趣的是,这不是这里发生的事情,但我仍然得到 NPE,我不确定这里到底出了什么问题。
我的 MainActivity
中有一个简单的 tabLayout
,它甚至还没有与任何片段挂钩。我像这样初始化和设置它:
ViewPager viewPager = new ViewPager(this);
TabLayout tabLayout = findViewById(R.id.tabsLayout);
tabLayout.setupWithViewPager(viewPager);
然后我使用自定义方法设置每个选项卡的 View
s,如下所示:
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 怎么为空?我肯定在这里遗漏了一些东西,但不知道到底是什么。
How come the imageView is null, when I set it up two lines above?
findViewById()
returns 如果在布局层次结构中找不到视图,则为 null。
您可能想调用 mainView.findViewById()
来搜索刚刚膨胀的视图层次结构而不是 activity 视图层次结构。