DialogPreferenceをカスタマイズする

アプリ説明

  1. メイン画面でメニューを押す
  2. PreferenceActivityが起動
  3. メニュー1を選択
  4. カスタムDialogPreferenceが起動する
  5. ごにょごにょと

構成

  • Activity
    • 起動画面:SampleDialogPreference
    • 設定画面:SettingActivity
  • DialogPreference
    • カスタムDialogPreference:SimpleDialogPreference
  • リソース

作成手順

プロジェクト作成
  • SampleDialogPreferenceという名前でプロジェクトを作成
設定画面の追加
  • PreferenceActivityの追加
    • Name : SettingActivity
    • Superclass : PreferenceActivity
  • ManifestファイルにSettingActivityを追加
        <activity android:name=".SettingActivity"
                  android:label="@string/app_name">
        </activity>
起動画面のリソース作成
  • menu作成
    • res以下にmenuフォルダ作成
    • menuフォルダにmenu.xml作成
    • 以下の内容を記述
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Menu1" android:id="@+id/item01" android:numericShortcut="1">
</item>
</menu>
起動画面の処理を実装
  • SampleDialogPreferenceにメニュー処理追加
    • onCreateOptionsMenuをオーバライド
    • 以下の内容を記述
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}
    • onOptionsItemSelectedをオーバライド
    • 以下の内容を記述
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Intent intent = new Intent(SampleDialogPreference.this, SettingActivity.class);
		startActivity(intent);
		return super.onOptionsItemSelected(item);
	}
DialogPreferenceのカスタマイズ
  • DialogPreferenceを継承したSimpleDialogPreferenceクラスを作成
  • コンストラクタをオーバライド
    • コンストラクタでは特になにもしない
package com.example.dilogpref;

import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;

public class SimpleDialogPreference extends DialogPreference {

	public SimpleDialogPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public SimpleDialogPreference(Context context, AttributeSet attrs,
			int defStyle) {
		super(context, attrs, defStyle);
	}
}
設定画面のリソース作成
  • resフォルダにxmlフォルダを追加
  • xmlフォルダにsetting.xmlを追加
  • setting.xmlに以下の内容を記述
    • android:key プリファレンスに保存するキーを指定
    • android:title プリファレンスアクティビティに表示するタイトル
    • android:summary タイトルのsummary
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

	<com.example.dilogpref.SimpleDialogPreference
		android:key="simplevalue" android:title="SimpleDialogPreference"
		android:summary="SimpleDialogPreference no summary">
	</com.example.dilogpref.SimpleDialogPreference>

</PreferenceScreen>
設定画面(SettingActivity)の処理実装
  • onCreateをオーバライド
  • 以下の内容を記述
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting);
	}
SimpleDialogPreferenceに処理実装
  • onCreateDialogViewをオーバライド
    • onCreateDialogViewメソッドでDialogに表示するViewを作成する。
    • EditTxtの追加
    • EditTextに保存された値を設定する。(最初は何も設定されていないのでnull)
      • getPersistedString(String dfaultValue) 保存されたデータを取得。引数は初期値
      • getKey() プリファレンスのキーを取得する
    • 以下の内容を記述
	@Override
	protected View onCreateDialogView() {
		this.edit = new EditText(this.getContext());
		this.edit.setText(getPersistedString("default"));
		return this.edit;
	}
  • Dialogを閉じたときの処理を追加
    • onDialogClosedのオーバライド
    • OKを選択した場合は、プリファレンスに値を保存する。キャンセルの時は何もしない
      • persistStringを使うと勝手に保存してくれる
    • 以下のように記述
	@Override
	protected void onDialogClosed(boolean positiveResult) {
		if(positiveResult){
			persistString(this.edit.getText().toString());
		}
		super.onDialogClosed(positiveResult);
	}

実行画面

初回

データに「hogehoge」と入力してOKをクリック

2回目

hogehogeが表示される

ソース

SampleDialogPreference
package com.example.dilogpref;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class SampleDialogPreference extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Intent intent = new Intent(SampleDialogPreference.this, SettingActivity.class);
		startActivity(intent);
		return super.onOptionsItemSelected(item);
	}
}
SettingActivity
package com.example.dilogpref;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class SettingActivity extends PreferenceActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting);
	}
}
SimpleDialogPreference
package com.example.dilogpref;

import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;

public class SimpleDialogPreference extends DialogPreference {

	EditText edit;
	public SimpleDialogPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public SimpleDialogPreference(Context context, AttributeSet attrs,
			int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	protected View onCreateDialogView() {
		this.edit = new EditText(this.getContext());
		this.edit.setText(getPersistedString("default"));
		return this.edit;
	}

	@Override
	protected void onDialogClosed(boolean positiveResult) {
		if(positiveResult){
			persistString(this.edit.getText().toString());
		}
		super.onDialogClosed(positiveResult);
	}
}
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:title="Menu1" android:id="@+id/item01" android:numericShortcut="1">
</item>
</menu>
setting.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

	<com.example.dilogpref.SimpleDialogPreference
		android:key="simplevalue" android:title="SimpleDialogPreference"
		android:summary="SimpleDialogPreference no summary">
	</com.example.dilogpref.SimpleDialogPreference>

</PreferenceScreen>