PreferenceScreen の中で Intent を指定できる

既存の Preference の要素、ListPreference などの入力画面形式でなくて、
他の入力画面にする場合、PreferenceScreen を用意し、Intent action入力画面 Activity
指定する方法がある。

画面は、このような例、

f:id:posturan:20160314233409p:plain


左にはアイコンもない、これをタップして次のように、任意の入力画面を起動、

f:id:posturan:20160314233359p:plain


OKをタップしたら、サマリに結果を反映

f:id:posturan:20160314233349p:plain



プリファレンスのXMLは、以下、

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/androidandroid:title="Intent preference  Sample">
   <PreferenceScreen android:title="地域コード" android:key="areaCd">

       <intent  android:action="android.intent.action.VIEW"
               android:targetPackage="org.sample"
               android:targetClass="org.sample.preference.AreaInputActivity" />

   </PreferenceScreen>
</PreferenceScreen>

この Intent が指定する画面Activity が以下、Button の onClick で、SharedPreferences.Editor を使って
入力結果を key="areaCd" に対してセットする。・・・commit() を忘れずに。

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/**
 * AreaInputActivity.java
 */

public class AreaInputActivity extends Activity{
   @Override
   protected void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);
       setTitle("Intent preference  Sample");
       setContentView(R.layout.areainput);
       final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       final EditText area = (EditText)findViewById(R.id.areaEditText);
       *1.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString("areaCd",area.getText().toString());
            editor.commit();
            finish();
         }
      });
      *2.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            finish();
         }
      });

   }
}

PreferenceActivity の実装では、onResume で サマリに設定結果を表示させる。

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
/**
 * AreaPreferenceActivity.java
 */

public class AreaPreferenceActivity extends PreferenceActivity{
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      addPreferencesFromResource(R.xml.exprefernce);
   }
   @Override
   protected void onResume(){

      super.onResume();
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
      Preference areaCd = findPreference("areaCd");
      areaCd.setSummary(preferences.getString("areaCd",""));
   }
}

他の画面での参照は、通常どおり。

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String areacd = sharedPref.getString("areaCd",null);

*1:Button)findViewById(R.id.okButton

*2:Button)findViewById(R.id.cancelButton