Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.TreeMap;
- import android.content.Context;
- import android.preference.DialogPreference;
- import android.util.AttributeSet;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- /**
- * 値としてint値を扱えるListPreference
- * 標準のListPreferenceは、Preferenceへ値としてStringが格納されるが数値を扱う際に不便、int値で格納できるようなものを作った。
- * entryValuesで指定する配列は <integer-array> にすること。
- */
- public class MyIntValueListPreference extends DialogPreference {
- // 現在の値
- int currentValue_=0;
- // 項目名
- String [] entrys_;
- // 値
- int [] values_;
- // 値を元に表示名を取得するためのMap
- TreeMap<Integer,String> valueToEntryStringMap_ = new TreeMap<Integer, String>();
- public MyIntValueListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- final String ANDROID_NAMESPASE="http://schemas.android.com/apk/res/android";
- // android:entries で指定されたXMLを取得して、リストの表示名一覧を取得
- String entResName = attrs.getAttributeValue(ANDROID_NAMESPASE, "entries");
- int entArrayId = context.getResources().getIdentifier( entResName, "values", context.getPackageName());
- if ( entArrayId ==0 ) {
- // 「@array/item_names」みたいのを期待してたが実際とれるのは「@1234567」みたいなのだ。コレの場合getIdentifierは失敗して0がかえる
- entArrayId = Integer.parseInt(entResName.substring(1)); // @のあとの数値がidそのものなのでparseするか・・・
- }
- entrys_ = context.getResources().getStringArray(entArrayId);
- // android:entryValues で指定されたXMLを取得して、リストの値一覧を取得
- String valResName = attrs.getAttributeValue(ANDROID_NAMESPASE, "entryValues");
- int valArrayId = context.getResources().getIdentifier( valResName, "values", context.getPackageName());
- if ( valArrayId ==0 ) {
- // 「@array/item_names」みたいのを期待してたが実際とれるのは「@1234567」みたいなのだ。コレの場合getIdentifierは失敗して0がかえる
- valArrayId = Integer.parseInt(valResName.substring(1)); // @のあとの数値がidそのものなのでparseするか・・・
- }
- values_ = context.getResources().getIntArray(valArrayId);
- // Mapに格納
- for ( int i=0; i< values_.length; i++ ) {
- valueToEntryStringMap_.put(values_[i], entrys_[i]);
- }
- }
- @Override
- protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
- // 現在地セット
- if ( restorePersistedValue ){
- currentValue_ = getPersistedInt(currentValue_);
- }else{
- currentValue_ = (Integer)defaultValue;
- persistInt(currentValue_);
- }
- // サマリーを更新
- setSummaryToEntry();
- }
- @Override
- protected View onCreateDialogView() {
- ArrayAdapter<String> adapter = new ArrayAdapter<String>( getContext(), android.R.layout.simple_list_item_single_choice , entrys_);
- ListView listview = new ListView(getContext());
- listview.setAdapter(adapter);
- listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- int pos = findEntryPos() ;
- if ( pos>=0 ) listview.setItemChecked(pos, true);
- listview.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?>parent, View view, int position, long id) {
- currentValue_ = values_[position];
- }
- });
- return listview;
- }
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- if ( positiveResult) {
- persistInt(currentValue_);
- // サマリーを更新
- setSummaryToEntry();
- }
- }
- // サマリーを更新
- void setSummaryToEntry() {
- String entry = valueToEntryStringMap_.get(currentValue_);
- if ( entry == null ) entry = "(none)";
- setSummary(entry);
- }
- // 現在地に対応するvalues_配列のインデックスを得る (-1:存在しない)
- int findEntryPos() {
- int pos = -1;
- for ( int i=0; i<values_.length;i++ ) {
- if ( values_[i] == currentValue_ ) {
- pos = i;
- break;
- }
- }
- return pos;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement