読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

ActionBarを使ったspinnerレイアウトの作成

概要

ActionBarを使ってspinnerレイアウトを作成する

最小構成

Eclipseのプロジェクト作成からspinnerレイアウトを選択すればすぐひな形が出来る

途中までタブレイアウトのときと同じ
f:id:tiro105:20140407144111p:plain
Navigtion TypeをにAction Bar Spinnerを設定しFinish

これでspinnerレイアウトのアプリが実行できるはず

ソースの確認

レイアウト

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.spinnertest.MainActivity"
    tools:ignore="MergeRootFrame" />

logic

public class MainActivity extends ActionBarActivity implements
		ActionBar.OnNavigationListener {

appcompatを使っているのでActionBarActivityを継承
spinnerのイベントを処理するためにActionBar.OnNavigationListenerを実装

// Set up the action bar to show a dropdown list.
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

actionBarのspinnerを使用するのでsetNavigationModeにActionBar.NAVIGATION_MODE_LISTを指定
タイトル部にspinnerが表示されるのでタイトルを表示しないようにする

// Set up the dropdown list navigation in the action bar.
actionBar.setListNavigationCallbacks(
// Specify a SpinnerAdapter to populate the dropdown list.
		new ArrayAdapter<String>(actionBar.getThemedContext(),
				android.R.layout.simple_list_item_1,
				android.R.id.text1, new String[] {
						getString(R.string.title_section1),
						getString(R.string.title_section2),
						getString(R.string.title_section3), }), this);

spinnerにアダプターをセットする
actionBar.getThemedContext()はactionBar用のcontextを取得している
android.R.id.text1はandroid.R.layout.simple_list_item_1のtextvviewのIDを取得している

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
	// Restore the previously serialized current dropdown position.
	if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
		getSupportActionBar().setSelectedNavigationItem(
				savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
	}
}

@Override
public void onSaveInstanceState(Bundle outState) {
	// Serialize the current dropdown position.
	outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getSupportActionBar()
			.getSelectedNavigationIndex());
}

システムからアプリが復帰したときにspinnerの位置が保存されるようにしている

@Override
public boolean onNavigationItemSelected(int position, long id) {
	// When the given dropdown item is selected, show its contents in the
	// container view.
	getSupportFragmentManager()
			.beginTransaction()
			.replace(R.id.container,
					PlaceholderFragment.newInstance(position + 1)).commit();
	return true;
}

ActionBar.OnNavigationListenerを実装する際に必須となるメソッド
対応するspinnerが選択されたときにfragmentを設定している

参考
What is "android.R.id.text1"? - Stack Overflow