ページ

2013/08/15

[Android]ActionBarのListNavigationでドロップダウンを表示する

右のスクリーンショットは
僕の開発しているDevCameraのカメラ画面です。

撮影・連写・無音・無音連射ができるカメラが
分かれているので、カメラ選択画面に戻らずに
カメラを切り替えられるように
ActionBar の ListNavigation で表示しています。

DevCamera ではカメラアイコンの部分を
タップしたらカメラ選択画面へ戻り、
タイトル部分をタップしたらドロップダウンを表示するようにしています。
ActionBar#setDisplayHomeAsUpEnabled(boolean)
onOptionsItemSelected に id が android.R.id.home の MenuItem が
来るのでカメラ選択画面へ戻る処理を実装しました。
タイトル部分はドロップダウンにしたかったので
本来のタイトルは非表示にしています。(9, 10行目)

アイコンカラーの設定はわかりにくいですが、
継承でアイコンとカラーを変えています。

ListNavigation の設定は ActionBar#setNavigationMode(int)
ActionBar#NAVIGATION_MODE_LIST を設定し、
ActionBar#setListNavigationCallbacks(SpinnerAdapter, ActionBar.OnNavigationListener)
後述の表示部分とドロップダウンリストがタップされた際のリスナーを登録します。
ActionBar#setSelectedNavigationItem(int) | Android Developersで選択状態を設定できます。
public class BaseCameraActivity extends SherlockFragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        // ActionBar の設定
        mActionBar = getSupportActionBar();
        mActionBar.setDisplayHomeAsUpEnabled(true);
        mActionBar.setDisplayShowTitleEnabled(false);
        // アイコンのカラー設定
        CameraItem camera = App.sCameras.get(getCameraId());
        BitmapDrawable drawable = (BitmapDrawable)getResources().getDrawable(camera.getIconId());
        drawable.setColorFilter(getResources().getColor(camera.getColorId()), Mode.SRC_ATOP);
        mActionBar.setIcon(drawable);
        drawable.setCallback(null);
        // ListNavigation の設定
        mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        mActionBar.setListNavigationCallbacks(new CameraSpinnerAdapter(this), new OnNavigationListener(){
            @Override
            public boolean onNavigationItemSelected(int itemPosition, long itemId){
                if(itemPosition != getCameraId()){
                    // カメラ切り替え
                    startActivity(new Intent(getApplicationContext(), App.sCameras.get(itemPosition).getClazz()));
                    finish();
                    return true;
                }
                return false;

            }
        });
        mActionBar.setSelectedNavigationItem(getCameraId());
    }

}
タイトル部分の表示が getView で、ドロップダウン部分の表示が getDropDownView で設定できます。
[Android]ListViewのitem毎に有効/無効を設定する | DevAchieve
無効化、グレーアウトを解説しているのでサンプルでは省略しています。
public class CameraSpinnerAdapter extends ArrayAdapter<CameraItem> implements SpinnerAdapter {

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view;
        if(convertView == null){
            view = mLayoutInflater.inflate(R.layout.camera_spinner_item, parent, false);
        }else{
            view = convertView;
        }
        CameraItem item = getItem(position);
        ((TextView)view.findViewById(R.id.title)).setText(item.getTitleId());
        return view;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent){
        View view;
        if(convertView == null){
            view = mLayoutInflater.inflate(R.layout.camera_spinner_dropdown_item, parent, false);
        }else{
            view = convertView;
        }
        CameraItem item = getItem(position);
        ImageView icon = (ImageView)view.findViewById(R.id.icon);
        icon.setImageResource(item.getIconId());
        icon.setColorFilter(getContext().getColor(item.getColorId())));
        TextView title = (TextView)view.findViewById(R.id.title);
        title.setText(item.getTitleId());
        title.setTypeface(Typeface.DEFAULT_BOLD);
        return view;
    }

}