*

【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】リスト項目のmatch_parentが効かない

下記のようなリスト項目用のレイアウトを用意して、リストの右端にチェックボックスを置くようにしたのです

記事を読む

no image

【android】ハードウェアキー入力を検出する

Activityを継承したクラスで下記を記述します。 public boolean

記事を読む

no image

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

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

記事を読む

no image

【android】 setOnClickListener(false)が効かない

間違いその1 OnClickListenerが登録されているViewにsetClickable

記事を読む

no image

【android】オーバーレイでトップレイヤーにViewを表示する

常にホーム画面や他のアプリより前面にViewを表示する方法です。 前面に透明のViewGroupを

記事を読む

no image

【android】サービスの実装

ダウンロードなどActivityに依存したくない大きなバックグラウンド処理や常駐プロセスを作りたい場

記事を読む

no image

【android】ホーム画面や他のアプリの前面にViewを表示する。

WindowManagerのTYPE_SYSTEM_ALERTのレイヤーにViewを表示することで、

記事を読む

no image

【android】非同期処理

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

記事を読む

no image

【android】複数のカスタムテーマを設定で切り替える

背景色やアプリ全体のテーマ色を設定で変更したいという要望をもらったので実装してみました。

記事を読む

no image

【android】リソースからいろいろ取得する

リソースで定義したいろいろをコード内で呼び出す方法です。 レイアウト //リソースからレ

記事を読む

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 ↑