android-arrayadapter - CustomListPreference没有保存任何选项,也没有设置默认值

  显示原文与译文双语对照的内容
0 0

从listPreference中的sameple 自定义行? 我试图创建自己的定制 listpreference,但没有得到保存或者没有得到旧索引。


 public class FontSizePreference extends ListPreference {
 private CustomListPreferenceAdapter customListPreferenceAdapter = null;

 private Context mContext;

 private LayoutInflater mInflater;

//private CharSequence[] entries;

//private CharSequence[] entryValues;

 private ArrayList<RadioButton> rButtonList;

 private SharedPreferences prefs;

 private SharedPreferences.Editor editor;

 private static final String TAG = FontSizePreference.class.getSimpleName();

 private String font_size ="";

 public FontSizePreference(Context context, AttributeSet attrs) {
 super(context, attrs);
 mContext = context;
 mInflater = LayoutInflater.from(context);
 rButtonList = new ArrayList<RadioButton>();
 prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
 editor = prefs.edit();
 }

 @Override
 protected void onPrepareDialogBuilder(Builder builder) {

 font_size = prefs.getString(KEY_FONT_SIZE,"18");

 if (getEntries() == null || getEntryValues() == null
 || getEntries().length!= getEntryValues().length) {
 throw new IllegalStateException(
"ListPreference requires an entries array and an entryValues array which are both the same length");
 }

 customListPreferenceAdapter = new CustomListPreferenceAdapter(mContext, getEntries(),
 getEntryValues());

 builder.setAdapter(customListPreferenceAdapter, new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {

 }
 });

 super.onPrepareDialogBuilder(builder);
 }

 private class CustomListPreferenceAdapter extends BaseAdapter {

 private CharSequence[] entries;

 private CharSequence[] entryValues;

 public CustomListPreferenceAdapter(Context mContext, CharSequence[] entries,
 CharSequence[] entryValues) {
 this.entries = entries;
 this.entryValues = entryValues;
 }

 public int getCount() {
 return entries.length;
 }

 public Object getItem(int position) {
 return entries[position];
 }

 public long getItemId(int position) {
 return position;
 }

 public View getView(final int position, View convertView, ViewGroup parent) {
 CustomHolder holder = null;
 View row = convertView;
 if (row == null) {
 row = mInflater.inflate(R.layout.fontsize_layout, parent, false);
 }
 boolean flag = false;
 for (CharSequence entry : entryValues) {
 if (entry.toString().equals(font_size)) {
 flag = true;

 }
 }
 holder = new CustomHolder(row, position, font_size, flag);
 row.setTag(holder);
 row.setClickable(false);
 row.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {
 for (RadioButton rb : rButtonList) {
 Log.d(TAG,"current row listener :" + rb.getId() +" : : :" + position);

 if (rb.getId()!= position)
 rb.setChecked(false);
 else
 rb.setChecked(true);
 }

 int index = position;
 String value = (String)entryValues[index];
 editor.putString(KEY_FONT_SIZE, value).commit();
 getDialog().dismiss();
 }
 });

 return row;
 }

 class CustomHolder {
 private TextView text = null;

 private RadioButton rButton = null;

 CustomHolder(final View row, final int position, String prefValue, boolean checked) {

 Log.d(TAG,"current position is :" + position);
 text = (TextView)row.findViewById(R.id.fontSizeTitle);
 text.setText(entries[position]);
 text.setTextSize(Float.valueOf(entryValues[position].toString()));

 rButton = (RadioButton)row.findViewById(R.id.fontSizeState);
 int newIndex = Arrays.asList(entryValues).indexOf(prefValue);
//rButton.setId(newIndex);
 if (position!= newIndex)
 rButton.setChecked(false);
 rButtonList.add(rButton);

 rButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

 @Override
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//TODO Auto-generated method stub
 if (isChecked) {
 for (RadioButton rb : rButtonList) {
 if (rb!= buttonView)
 rb.setChecked(false);
 else {
 rb.setChecked(true);
 }

 }
 }

 int index = buttonView.getId();
 String value = (String)entryValues[position];

 editor.putString(KEY_FONT_SIZE, value).commit();

 getDialog().dismiss();
 }
 });
 }
 }
 }

每次运行这个示例时,它生成 35个单选按钮实例,它不显示上一个选中按钮或者视图中当前选中的按钮。 请帮我解决这个问题。 下面是用于数组。布局和prefernce调用的xml代码


<string-array name="font_size_options">
 <item>Larger</item>
 <item>Large</item>
 <item>Medium</item>
 <item>Small</item>
 <item>Smallest</item>
 </string-array>

 <string-array name="font_size_values">
 <item>26</item>
 <item>20</item>
 <item>18</item>
 <item>14</item>
 <item>10</item>
 </string-array>

布局 xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:clickable="true"
 android:orientation="horizontal"
 android:padding="5dp"> 

 <TextView
 android:id="@+id/fontSizeTitle"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_vertical"
 android:layout_weight="1"

/>



 <RadioButton
 android:id="@+id/fontSizeState"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_vertical"
 android:layout_weight="0"/>

</LinearLayout>

首选项是:


<com.example.samplepreference.FontSizePreference
 android:key="semc_pref_key_font_size"
 android:entries="@array/font_size_options"
 android:entryValues="@array/font_size_values"
 android:title="@string/font_size_title"/>

同时设置按钮 (rButton.setId(newIndex)) 总是返回 nullpointer 。

时间: 原作者:

0 0

我用另一个例子解决了这个问题:( 挑选的想法) 忘记了这个解决方案的链接,但是一旦发现它。


public class FontSizePreference extends ListPreference {

 private Context mContext;

 private CharSequence[] entries = null;

 private CharSequence[] entryValues = null;

 private SharedPreferences prefs;

 private SharedPreferences.Editor editor;

 private static final String TAG = FontSizePreference.class.getSimpleName();

 private String font_size ="";

 public FontSizePreference(Context context, AttributeSet attrs) {
 super(context, attrs);
 mContext = context;
 prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
 editor = prefs.edit();
 entries = getEntries();
 entryValues = getEntryValues();

 }



 @Override
 protected Object onGetDefaultValue(TypedArray a, int index) {
 return super.onGetDefaultValue(a, 2);
 }

 @Override
 protected void onPrepareDialogBuilder(Builder builder) {

 String choosenIndex = getPersistedString("18");
 choosenIndex = (!getValue().equals(choosenIndex))? choosenIndex : getValue();
 ListAdapter adapter = new FontSizeListAdapter(getContext(),
 R.layout.fontsize_layout, entries, entryValues,
 Arrays.asList(entryValues).indexOf(choosenIndex), this);
 builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

 @Override
 public void onClick(DialogInterface arg0, int arg1) {

 }
 });
 super.onPrepareDialogBuilder(builder);
 }

 class CustomListAdapter implements ListAdapter {

 private int selectedIndex = 0;

 public CustomListAdapter(Context context, int customFontLayout,
 CharSequence[] entries, CharSequence[] entryValues,
 int selectedValue) {
 this.selectedIndex = selectedValue;
 }

 @Override
 public int getCount() {
 return entries.length;
 }

 @Override
 public Object getItem(int index) {
 return entryValues[index];
 }

 @Override
 public long getItemId(int index) {
 return index;
 }

 @Override
 public int getItemViewType(int index) {
 return index;
 }

 @Override
 public View getView(final int index, View anotherView, ViewGroup parent) {

 View row = anotherView;

 if (row == null) {
 row = LayoutInflater.from(getContext()).inflate(
 R.layout.fontsize_layout, parent, false);
 }
 TextView txtView = (TextView) row.findViewById(R.id.fontSizeTitle);
 RadioButton buttonView = (RadioButton) row
. findViewById(R.id.fontSizeState);
 row.setId(Integer.valueOf(entryValues[index].toString()));
 txtView.setText(entries[index]);

 if (index == selectedIndex) {
 buttonView.setChecked(true);
 }
 txtView.setTextSize(Float.valueOf((String) entryValues[index]));
 row.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
 persistString(String.valueOf(v.getId()));

 getDialog().dismiss();
 }
 });

 buttonView.setOnCheckedChangeListener(
 new CompoundButton.OnCheckedChangeListener() {

 @Override
 public void onCheckedChanged(CompoundButton buttonView,
 boolean isChecked) {

 if (isChecked) {
 buttonView.setId(index);
 persistString(
 String.valueOf(entryValues[buttonView.getId()]));
 getDialog().dismiss();
 }

 }
 });

 return row;
 }

 @Override
 public int getViewTypeCount() {
//TODO Auto-generated method stub
 return entryValues.length;
 }

 @Override
 public boolean hasStableIds() {
//TODO Auto-generated method stub
 return false;
 }

 @Override
 public boolean isEmpty() {
//TODO Auto-generated method stub
 return false;
 }

 @Override
 public void registerDataSetObserver(DataSetObserver arg0) {
//TODO Auto-generated method stub

 }

 @Override
 public void unregisterDataSetObserver(DataSetObserver arg0) {
//TODO Auto-generated method stub

 }

 @Override
 public boolean areAllItemsEnabled() {
//TODO Auto-generated method stub
 return false;
 }

 @Override
 public boolean isEnabled(int arg0) {
//TODO Auto-generated method stub
 return false;
 }

 }

 @Override
 protected String getPersistedString(String defaultReturnValue) {
 return super.getPersistedString(defaultReturnValue);
 }

 @Override
 protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
 if (!restoreValue) {
 super.onSetInitialValue(restoreValue,"18");
 } else
 super.onSetInitialValue(restoreValue, defaultValue);
 }

 public boolean persistString (String value) {
 return super.persistString(value);
 }



}

原作者:
...