Android の Preference 画面で、選択肢であるが入力結果を反映したいパターンに悩んだ。
例えば、こんな画面、、
でもこの画面にあるように「その他 URL選択」を選んだ場合は、開始ページの下の
「その他のURL」が押せる状態(活性化)して入力して開始ページに反映したい。
以下が、その他 URL選択を選んだ時で、一度も「その他のURLを入力していない場合、
そして、入力、、、
これらの prefrence の XML は、、、
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference android:title="開始ページ" android:key="pageurl"/>
<EditTextPreference android:title="その他のURL"
android:key="otherurl"
android:dialogTitle="その他のURL"
android:positiveButtonText="OK"
android:negativeButtonText="cancel"
android:dialogMessage="開始ページ設定の選択支としてセットします。"/>
</PreferenceScreen>
そして、PreferenceActivity 継承クラスは、、、
public class UrlSettingPreferenceActiviy extends PreferenceActivity{
public final static String OTHER_URL = "otherurl";
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTitle("ページ設定");
addPreferencesFromResource(R.xml.urlprefrence);
final EditTextPreference otherurl = (EditTextPreference)findPreference("otherurl");
final ListPreference pageurl = (ListPreference)findPreference("pageurl");
otherurl.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
@Override
public boolean onPreferenceChange(Preference preference,Object newValue){
String value = newValue.toString();
preference.setSummary(value);
if (value.startsWith("http")){
pageurl.setSummary(newValue.toString());
}
return true;
}
});
pageurl.setEntries(new String{"Google","Yahoo","その他 URL選択"});
final String urlarrays = new String[]{"http://www.google.co.jp/","http://m.yahoo.co.jp/",OTHER_URL};
pageurl.setEntryValues(urlarrays);
pageurl.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
@Override
public boolean onPreferenceChange(Preference preference,Object newValue){
if (newValue != null){
for(String u : urlarrays){
if (u.equals(OTHER_URL)){
otherurl.setEnabled(true);
String otherurlText = otherurl.getText();
if (otherurlText==null || !otherurlText.startsWith("http")){
preference.setSummary("その他のURL設定で入力設定してください");
}else{
preference.setSummary(otherurlText);
}
break;
}else if (u.equals(newValue)){
preference.setSummary(u);
otherurl.setEnabled(false);
break;
}
}
}
return true;
}
});
}
}
この UrlSettingPreferenceActiviy と紐づくプリファレンスからURLを読み取るのに
以下のように private メソッドを用意する。注意すべきは、ListPreference の setEntryValues に指定する
文字列の配列の中に、null を設定できないので、しかたなくユニークな判定文字列、
UrlSettingPreferenceActiviy.OTHER_URL を用意した。
private String getPageturl(){
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
String s = sharedPreferences.getString("pageurl",null);
if (s==null) return null;
if (s.equals(UrlSettingPreferenceActiviy.OTHER_URL)){
s = sharedPreferences.getString("otherurl",null);
}
return s;
}
以下のように呼び出す。
String pageUrl = getPageturl();
if (pageUrl==null){
startActivity(new Intent(this,UrlSettingPreferenceActiviy.class));
return;
}