*

【android】標準の設定画面を作る

公開日: : 最終更新日:2012/06/06 android

設定画面のテンプレートです。
検索一発クンのコードから抜粋しました。
チェックボックス、リスト、テキスト入力があります。

必要なファイル

  • values/string.xml
  • xml/pref.xml
  • MyPrefActivity.java

values/string.xml

<!-- EditText, CheckBox -->
<string name="pref_boot_overlay_title">オーバーレイを使用</string>
<string name="pref_boot_overlay_summary">どの画面からでもワンタッチで起動できます</string>

<!-- リスト -->
<string name="pref_boot_overlay_position_title">オーバーレイの位置</string>
<string name="pref_boot_overlay_position_summary">オーバーレイの位置</string>
<string name="pref_boot_overlay_position_dialogtitle">オーバーレイの位置</string>
<string-array name="pref_boot_overlay_position_entries">
    <item>左上</item>
    <item>左中央</item>
    <item>左下</item>
    <item>右上</item>
    <item>右中央</item>
    <item>右下</item>
</string-array>
<string-array name="pref_boot_overlay_position_values">
    <item>0</item>
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>4</item>
    <item>5</item>
</string-array>

xml/pref.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory>

        <EditTextPreference
        	android:key="@string/prefkey_edit_favengine"
        	android:title="@string/pref_edit_favengine_title"
        	 />

        <CheckBoxPreference
        	android:key="@string/prefkey_overlay"
        	android:title="@string/pref_boot_overlay_title"
        	android:summary="@string/pref_boot_overlay_summary"
        	android:defaultValue="false"
        	 />
        <ListPreference
            android:key="@string/prefkey_searchbarPosition"
        	android:title="@string/pref_searchbar_position_title"
        	android:summary="@string/pref_searchbar_position_summary"
            android:dialogTitle="@string/pref_searchbar_position_title"
            android:entries="@array/pref_searchbar_position_entries"
            android:entryValues="@array/pref_searchbar_position_values"
        	android:defaultValue="1"
             />
         
    </PreferenceCategory>
    
</PreferenceScreen>

MyPrefActivity.java

public class MyPreferenceActivity extends PreferenceActivity{
	private final String TAG = MyPreferenceActivity.class.getSimpleName();
	
	//変更の有無を親Activityに伝えるintentのキー
	static public final String EXTRAKEY_CHANGE_FLAG = "changePref";

	//変更の有無を親Activityに伝える定数
	static public final int CHANGE_PREF_FAV_ENGINE = 1;
	static public final int CHANGE_PREF_SEARCHBAR_POSITION = 2;
	static public final int CHANGE_PREF_BOOT_STATUSBAR = 4;
	static public final int CHANGE_PREF_BOOT_OVERLAY = 8;
	
	//変更の有無を親Activityに伝える変数
	private int changeFlag = 0;
	
	SharedPreferences sp;//プリファレンス
	private final PreferenceActivity act = this;

	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		this.addPreferencesFromResource(R.xml.preferences);
		setResult(RESULT_OK);

		sp = PreferenceManager.getDefaultSharedPreferences(this);
		
		initEditFavEngine( R.string.prefkey_edit_favengine );
		initCbBootStatusbar( R.string.prefkey_dispOnStatusBar );
		initListSearchbarPosition( R.string.prefkey_searchbarPosition );
	}

	@Override
	public void onStart(){
		super.onStart();
		
		initCbOverlay( R.string.prefkey_overlay );
	}
	
	@Override
	public void onDestroy(){
		super.onDestroy();
		
		setResult();
		reflectSettings();
	}
	
	
	/****************************
	 * 初期化
	 *****************************/
	//リストの初期化
	private void initListSearchbarPosition(int resourceIdOfpreferenceKey){
		final ListPreference list = (ListPreference)findPreference(
				getResources().getString(resourceIdOfpreferenceKey)
				);
		
		//保存済みの設定をサマリーに表示
		list.setSummary( getSelectedListEntryName(list, list.getValue()) );

		//設定が変更された値をサマリーに表示する
		list.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
			public boolean onPreferenceChange(Preference preference, Object newValue) {
				//サマリの文字列を更新
				list.setSummary( getSelectedListEntryName(list, newValue) );
				
				//変更を記録
				changeFlag = changeFlag | CHANGE_PREF_SEARCHBAR_POSITION;

				return true;
			}
		});
	}
	
	//CheckBoxの初期化
	private void initCbOverlay(int resourceIdOfpreferenceKey){
		final CheckBoxPreference item = (CheckBoxPreference)findPreference(
				getResources().getString(resourceIdOfpreferenceKey)
				);
		
		item.setChecked( sp.getBoolean(getResources().getString(resourceIdOfpreferenceKey), false) );

		//変更のイベンとリスナ
		item.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
			public boolean onPreferenceChange(Preference preference, Object newValue) {
				startActivity( new Intent(act, MyPrefOverlayActivity.class) );

				//変更を記録
				changeFlag = changeFlag | CHANGE_PREF_BOOT_OVERLAY;

				return false;
			}
		});
	}
	
	/****************************
	 * ユーティリティ
	 *****************************/

	private CharSequence getSelectedListEntryName(ListPreference list, Object value){
		//選択されたリストエントリーの表示名を返す
		
		int selectedIndex = 0;		
		CharSequence[] values = list.getEntryValues();

		for(int i=0; i<values.length; ++i){
			if( values[i].equals( String.valueOf(value) ))selectedIndex = i;
		}
		
		return list.getEntries()[selectedIndex];
	}

	/****************************
	 * 終了処理
	 *****************************/

	//呼び出し元にデータを送る
	private void setResult(){
		Intent intent = new Intent();
		intent.putExtra(EXTRAKEY_CHANGE_FLAG, changeFlag);
		setResult(RESULT_OK, intent);
	}
	
	//設定を反映
	private void reflectSettings(){

		if( sp.getBoolean(this.getResources().getString(R.string.prefkey_overlay), true) ) {
		}else{
		}

	}
	
}// end of class

関連記事

no image

【android】 APIバージョンによる動作の違い

「最近使用したアプリケーション」からの起動 2.x系 -> onNewIntentが呼ばれる 4

記事を読む

no image

【android】webviewでアプリ内にwebページを読み込む

webviewを使ってandroidアプリ内にwebページを読み込む定型文です。 //vie

記事を読む

no image

【android】 年月だけのDatePicker

final DatePicker datePicker = new DatePicker(sel

記事を読む

no image

ダイアログを表示する

カスタムアラートダイアログ private void showCustomAlert(A

記事を読む

no image

[android] JSONのパースにかかる時間

リストデータなんかを保存したいというのはよくある要件だと思います。 DBは面倒だしカラム毎に集計す

記事を読む

no image

【android】 Android4.1のserviceでdefaultPreferenceがおかしい

【現象】 ActivityでdefaultPreferencesで保存したデータがservice内

記事を読む

no image

【android】スリープモードに入らせない

Androidでは一定時間、操作をしないとスリープモードに入って待機状態になってしまいますが、動

記事を読む

no image

【android】stringsリソースにパラメータを埋め込む

●strings.xml %n$x n : 引数に渡す際の順番。n番目の引数。 x

記事を読む

no image

インテント

基本 //任意のアクティビティの起動 Intent intent = new

記事を読む

no image

【android】非同期処理

Androidで非同期処理、マルチスレッドを処理するスニペット。 AndroidのスレッドはUIス

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

no image
知らないと損をする6つのライセンスまとめ

オープンソースやフリーウェア、フリー素材などが巷に溢れ、それらを利用す

no image
ガリレオ:ニュースブラウザをリリースしました。

概要 ガリレオはニュースを読んだり、検索する機能に特化したブラウザア

no image
【android】Activityとプロセスのライフサイクル

またもやライフサイクル周りでハマったのですが、Androidのライフサ

→もっと見る

PAGE TOP ↑