Advertisement
fslasht

MyIntValueListPreference.java

Apr 26th, 2013
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 4.23 KB | None | 0 0
  1. import java.util.TreeMap;
  2. import android.content.Context;
  3. import android.preference.DialogPreference;
  4. import android.util.AttributeSet;
  5. import android.view.View;
  6. import android.widget.AdapterView;
  7. import android.widget.AdapterView.OnItemClickListener;
  8. import android.widget.ArrayAdapter;
  9. import android.widget.ListView;
  10.  
  11.  
  12.  
  13. /**
  14.  * 値としてint値を扱えるListPreference
  15.  * 標準のListPreferenceは、Preferenceへ値としてStringが格納されるが数値を扱う際に不便、int値で格納できるようなものを作った。
  16.  * entryValuesで指定する配列は <integer-array> にすること。
  17.  */
  18. public class MyIntValueListPreference extends DialogPreference {
  19.     // 現在の値
  20.     int currentValue_=0;
  21.  
  22.     // 項目名
  23.     String [] entrys_;
  24.     // 値
  25.     int [] values_;
  26.  
  27.     // 値を元に表示名を取得するためのMap
  28.     TreeMap<Integer,String> valueToEntryStringMap_ = new TreeMap<Integer, String>();
  29.  
  30.  
  31.     public MyIntValueListPreference(Context context, AttributeSet attrs) {
  32.         super(context, attrs);
  33.  
  34.  
  35.          final String ANDROID_NAMESPASE="http://schemas.android.com/apk/res/android";
  36.  
  37.         // android:entries で指定されたXMLを取得して、リストの表示名一覧を取得
  38.         String entResName = attrs.getAttributeValue(ANDROID_NAMESPASE, "entries");
  39.         int entArrayId = context.getResources().getIdentifier( entResName, "values", context.getPackageName());
  40.         if ( entArrayId ==0 ) {
  41.             // 「@array/item_names」みたいのを期待してたが実際とれるのは「@1234567」みたいなのだ。コレの場合getIdentifierは失敗して0がかえる
  42.             entArrayId = Integer.parseInt(entResName.substring(1)); // @のあとの数値がidそのものなのでparseするか・・・
  43.         }
  44.         entrys_ = context.getResources().getStringArray(entArrayId);
  45.  
  46.         // android:entryValues で指定されたXMLを取得して、リストの値一覧を取得
  47.         String valResName = attrs.getAttributeValue(ANDROID_NAMESPASE, "entryValues");
  48.         int valArrayId = context.getResources().getIdentifier( valResName, "values", context.getPackageName());
  49.         if ( valArrayId ==0 ) {
  50.             // 「@array/item_names」みたいのを期待してたが実際とれるのは「@1234567」みたいなのだ。コレの場合getIdentifierは失敗して0がかえる
  51.             valArrayId = Integer.parseInt(valResName.substring(1)); // @のあとの数値がidそのものなのでparseするか・・・
  52.         }
  53.         values_ = context.getResources().getIntArray(valArrayId);
  54.  
  55.         // Mapに格納
  56.         for ( int i=0; i< values_.length; i++ ) {
  57.             valueToEntryStringMap_.put(values_[i], entrys_[i]);
  58.         }
  59.  
  60.     }
  61.     @Override
  62.     protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
  63.         // 現在地セット
  64.         if ( restorePersistedValue ){
  65.             currentValue_ = getPersistedInt(currentValue_);
  66.         }else{
  67.             currentValue_ = (Integer)defaultValue;
  68.             persistInt(currentValue_);
  69.         }
  70.  
  71.         // サマリーを更新
  72.         setSummaryToEntry();
  73.     }
  74.  
  75.  
  76.  
  77.     @Override
  78.     protected View onCreateDialogView() {
  79.         ArrayAdapter<String> adapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_list_item_single_choice , entrys_);
  80.         ListView listview = new ListView(getContext());
  81.         listview.setAdapter(adapter);
  82.         listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  83.         int pos = findEntryPos() ;
  84.         if ( pos>=0 ) listview.setItemChecked(pos, true);
  85.         listview.setOnItemClickListener(new OnItemClickListener() {
  86.             @Override
  87.             public void onItemClick(AdapterView<?>parent, View view, int position, long id) {
  88.                 currentValue_ = values_[position];
  89.  
  90.             }
  91.         });
  92.  
  93.         return listview;
  94.     }
  95.  
  96.     @Override
  97.     protected void onDialogClosed(boolean positiveResult) {
  98.         if ( positiveResult) {
  99.             persistInt(currentValue_);
  100.  
  101.             // サマリーを更新
  102.             setSummaryToEntry();
  103.  
  104.         }
  105.     }
  106.  
  107.  
  108.     // サマリーを更新
  109.     void setSummaryToEntry() {
  110.         String entry = valueToEntryStringMap_.get(currentValue_);
  111.         if ( entry == null ) entry = "(none)";
  112.         setSummary(entry);
  113.     }
  114.  
  115.     // 現在地に対応するvalues_配列のインデックスを得る (-1:存在しない)
  116.     int findEntryPos() {
  117.         int pos = -1;
  118.         for ( int i=0; i<values_.length;i++ ) {
  119.             if ( values_[i] == currentValue_ ) {
  120.                 pos = i;
  121.                 break;
  122.             }
  123.         }
  124.         return pos;
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement