如何修复
方法调用
setIcon
可能会产生java.lang.NullPointerException
?
private void setupTabIcons() {
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
tabLayout.getTabAt(2).setIcon(tabIcons[2]);
}
将图标设置为标签布局时,我收到此消息。
答案 0 :(得分:1)
这样的事情应该可以解决你的警告:
private void setupTabIcons() {
if (tabLayout!=null){
if (tabLayout.getTabAt(0)!=null)
tabLayout.getTabAt(0).setIcon(tabIcons[0]);
if (tabLayout.getTabAt(1)!=null)
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
if (tabLayout.getTabAt(2)!=null)
tabLayout.getTabAt(2).setIcon(tabIcons[2]);
}
}
答案 1 :(得分:1)
您需要检查tabLayout
是否为空
if(tabLayout == null){
return;
}
并检查getTabAt
返回的内容是否为空
ActionBar.Tab x = tabLayout.getTabAt(0);
if(x != null){
x.setIcon(tabIcons[0]);
}
顺便说一句,您可能在IDE上有一些配置错误,因为这通常是警告,而不是错误。
答案 2 :(得分:0)
您需要检查getTabAt(x)返回的是否为null:
private void setupTabIcons(TabLayout tabs) {
int tabIcons[] = {R.drawable.icon1, R.drawable.icon2, R.drawable.icon3};
TabLayout.Tab tab;
for (int x=0; x<3; x++) {
tab = tabs.getTabAt(x);
if(tab != null){
tab.setIcon(tabIcons[x]);
}
}
}
答案 3 :(得分:0)
您正面临此问题,因为您尚未添加标签并尝试设置图标
//Add tabs icon with setIcon() or simple text with .setText()
tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_home));
tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_profile));
tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_settings));
答案 4 :(得分:0)
使用setIcon
设置在tabLayout
之前调用的tabLayout.setupWithViewPager(viewPager);
方法时,这将在运行时引发空指针异常。
要解决运行时错误,您应该在活动的setupTabIcons()
方法的tabLayout.setupWithViewPager(viewPager);
行之后调用onCreate
。
但这仍然会在android studio中显示警告,因此要删除警告并防止运行时错误,您应该更改代码以获取标签页索引,而不是像{ {1}},.getTabAt(0)
,.getTabAt(1)
个部分
为方便起见,我将在我的代码中举一个例子:
.getTabAt(2)
注意:创建标签页时,请确保private TabAdapter tabAdapter;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.ic_action_profile,
R.drawable.ic_action_people,
R.drawable.ic_action_messages
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
viewPager = findViewById(R.id.viewPager);
tabLayout = findViewById(R.id.tabLayout);
// Create the adapter that will return a fragment for each of the two
// primary sections of the activity.
tabAdapter = new TabAdapter(getSupportFragmentManager());
tabAdapter.addFragment(new AccountFragment(), "Account");
tabAdapter.addFragment(new HomeFragment(), "People");
tabAdapter.addFragment(new CommunicateFragment(), "Messages");
viewPager.setAdapter(tabAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setupWithViewPager(viewPager);
for (int i=0; i<tabLayout.getTabCount();i++) {
tabLayout.getTabAt(i).setIcon(tabIcons[i]);
}
}
数组中的图标数量相等。