如何修复方法调用'setIcon'可能会产生'java.lang.NullPointerException'

时间:2017-01-10 07:15:32

标签: java

如何修复

  

方法调用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]);
} 

将图标设置为标签布局时,我收到此消息。

5 个答案:

答案 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]); } } 数组中的图标数量相等。