0

TabLayoutを持つ単純なアプリケーションを開発しています。各タブには、独自のアイコン描画機能があります。タブがアクティブな場合、そのアイコンは白色でなければなりません。そうでない場合は、暗い色になります。私はこのコードを書くとき今:Android "setColorFilterがNullPointerExceptionを生成する"注意が消えて

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のスタジオは私にはNullPointerExceptionについて注意を与える: SetColorFilter may produce 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スタジオの悪い行動ですか?

答えて

1

TabLayoutgetIcon()メソッドに@Nullableアノテーションがあるため、この警告が表示されます。これを見るには、IDEのメソッドのソースコードを表示するか(shift + clickを実行すると思います)、またはメソッドhereを検索します。

このアノテーションの目的は、開発者がこのメソッドがnullを返す可能性があることを認識しているため、アプリケーションロジックでそのようなケースを計画することができます。それ以外の場合、がnullを返したときにsetColorFilter()に電話をかけようとすると、NullPointerException

関連する問題