選択肢と入力の連携

Android の Preference 画面で、選択肢であるが入力結果を反映したいパターンに悩んだ。
例えば、こんな画面、、

f:id:posturan:20160314233535p:plain


でもこの画面にあるように「その他 URL選択」を選んだ場合は、開始ページの下の
「その他のURL」が押せる状態(活性化)して入力して開始ページに反映したい。
以下が、その他 URL選択を選んだ時で、一度も「その他のURLを入力していない場合、

f:id:posturan:20160314233519p:plain


そして、入力、、、

f:id:posturan:20160314233510p:plain

 

f:id:posturan:20160314233505p:plain



これらの 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;
}