
右のスクリーンショットは僕の開発している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;
}
}