ActionBar Tab アイコン

ActionBar Tab 表示でアイコンを使用して選択時と非選択時のアイコンを変える場合、、

f:id:posturan:20160313193156p:plain



このようなTabデザインの時、、

単純だが、以下のように選択時のアイコンと非選択時のアイコンの drawable ID を返すものを用意する

private int getTabIconId(int position, boolean selected){
   switch(position){
   case 0:
      return selected ? R.drawable.ic_action_1 : R.drawable.ic_action_1_unselect;
   case 1:
      return selected ? R.drawable.ic_action_2 : R.drawable.ic_action_2_unselect;
   case 2:
      return selected ? R.drawable.ic_action_3 : R.drawable.ic_action_3_unselect;
   default:
      return selected ? R.drawable.ic_action_1 : R.drawable.ic_action_1_unselect;
   }
}

このメソッドを Activity の中に書き、android.app.ActionBar#newTab() 時は、selected = false を、
ActionBar.TabListener の onTabSelected では、selected = true
ActionBar.TabListener の onTabUnselected では、selected = false を実行する。

public class SampleActivity extends FragmentActivity implements ActionBar.TabListener{
   SectionsPagerAdapter mSectionsPagerAdapter;
   ViewPager mViewPager;


   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      final ActionBar actionBar = getActionBar();
      actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

      mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
      mViewPager = (ViewPager)findViewById(R.id.pager);
      mViewPager.setAdapter(mSectionsPagerAdapter);

      mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
         @Override
         public void onPageSelected(int position){
            actionBar.setSelectedNavigationItem(position);
         }
      });

      for(int i=0;i < mSectionsPagerAdapter.getCount();i++){
         actionBar.addTab(actionBar.newTab()
            .setIcon(getTabIconId(i, false))
            .setTabListener(this)
         );
      }
   }
   @Override
   public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction){

      tab.setIcon(getTabIconId(tab.getPosition(), true));
      mViewPager.setCurrentItem(tab.getPosition());
   }
   @Override
   public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction){

      tab.setIcon(getTabIconId(tab.getPosition(), false));
   }
   @Override
   public void onTabReselected(Tab tab, FragmentTransaction ft){
      // Tabが再選択された時の処理、注意!swipe 操作では呼ばれない、
      // Tab を再選択としてタップした時に呼ばれる。
   }