Android 安卓;setColorFilter可能会产生NullPointerException“;小心消失了
我正在开发一个简单的应用程序,它有TabLayout。每个选项卡都有自己的可绘制图标。当选项卡处于活动状态时,其图标应为白色,否则应为深色。现在,当我编写此代码时:Android 安卓;setColorFilter可能会产生NullPointerException“;小心消失了,android,android-studio,nullpointerexception,android-tablayout,colorfilter,Android,Android Studio,Nullpointerexception,Android Tablayout,Colorfilter,我正在开发一个简单的应用程序,它有TabLayout。每个选项卡都有自己的可绘制图标。当选项卡处于活动状态时,其图标应为白色,否则应为深色。现在,当我编写此代码时: tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) {
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
tab.getIcon().setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorIcons), PorterDuff.Mode.SRC_IN);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tab.getIcon().setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorDivider), PorterDuff.Mode.SRC_IN);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
Android studio提醒我注意NullPointerException:
然而,当我将此提取到单独的方法时,一切正常,Android Studio不会抱怨:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
setIconColor(tab.getIcon(), true);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
setIconColor(tab.getIcon(), false);
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
这种新方法:
private void setIconColor(Drawable icon, boolean active){
if (active) {
icon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorIcons), PorterDuff.Mode.SRC_IN);
} else {
icon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorDivider), PorterDuff.Mode.SRC_IN);
}
}
奇怪的是,在将功能发送到单独的方法之后,它不再抱怨方法调用可能会产生NullPointerException。我是否遗漏了什么,或者这是Android studio的一个不良行为?您看到此警告是因为
TabLayout
中的getIcon()
方法有注释。要查看它,您可以在IDE中查看该方法的源代码(我相信通过按住shift键并单击),或者搜索该方法
在任何情况下,此注释的目的都是让您作为开发人员了解此方法可能返回null
,因此您可能希望在应用程序逻辑中为此类情况制定计划。否则,如果在getIcon()
返回null
时尝试调用setColorFilter()
,则会导致NullPointerException