今天用到了android的preferences组件,可是android定义的preferrence组件只有:CheckboxBoxPrefrence、EditTextPreference、ListPreference等几个组件,可是公司要求我在preferences中用RadioButton,没办法只好自定义一个RadioPreference,方法如下:

一、写一个只有RadioButton的layout:

<?xml version="1.0" encoding="utf-8"?>

<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/radiobutton" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_marginRight="4dip" android:focusable="false" android:clickable="false"></RadioButton>
二、定义RadioPreference类:
import android.app.Service;import android.content.Context;import android.content.SharedPreferences;import android.content.res.TypedArray;import android.os.Parcel;import android.os.Parcelable;import android.preference.Preference;import android.util.AttributeSet;import android.view.View;import android.view.accessibility.AccessibilityEvent;import android.view.accessibility.AccessibilityManager;import android.widget.Checkable;public class RadioPreference extends Preference {private CharSequence mSummaryOn;private CharSequence mSummaryOff;private boolean mSendAccessibilityEventViewClickedType;private AccessibilityManager mAccessibilityManager;private boolean mChecked;private boolean mDisableDependentsState;public RadioPreference(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);mAccessibilityManager = (AccessibilityManager) getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);}public RadioPreference(Context context, AttributeSet attrs) {super(context, attrs);mAccessibilityManager = (AccessibilityManager) getContext().getSystemService(Service.ACCESSIBILITY_SERVICE);}public RadioPreference(Context context) {super(context);}@Overridepublic boolean isPersistent() {return false;}@Overrideprotected void onBindView(View view) {super.onBindView(view);View checkboxView = view.findViewById(com.lenovo.tmp.R.id.radiobutton);if (checkboxView != null && checkboxView instanceof Checkable) {((Checkable) checkboxView).setChecked(mChecked);if (mSendAccessibilityEventViewClickedType&& mAccessibilityManager.isEnabled()&& checkboxView.isEnabled()) {mSendAccessibilityEventViewClickedType = false;int eventType = AccessibilityEvent.TYPE_VIEW_CLICKED;checkboxView.sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));}}}@Overrideprotected void onClick() {super.onClick();boolean newValue = !isChecked();mSendAccessibilityEventViewClickedType = true;if (!callChangeListener(newValue)) {return;}setChecked(newValue);}/** * Sets the checked state and saves it to the {@link SharedPreferences}. *  * @param checked *            The checked state. */public void setChecked(boolean checked) {if (mChecked != checked) {mChecked = checked;persistBoolean(checked);notifyDependencyChange(shouldDisableDependents());notifyChanged();}}/** * Returns the checked state. *  * @return The checked state. */public boolean isChecked() {return mChecked;}@Overridepublic boolean shouldDisableDependents() {boolean shouldDisable = mDisableDependentsState ? mChecked : !mChecked;return shouldDisable || super.shouldDisableDependents();}/** * Sets the summary to be shown when checked. *  * @param summary *            The summary to be shown when checked. */public void setSummaryOn(CharSequence summary) {mSummaryOn = summary;if (isChecked()) {notifyChanged();}}/** * @see #setSummaryOn(CharSequence) * @param summaryResId *            The summary as a resource. */public void setSummaryOn(int summaryResId) {setSummaryOn(getContext().getString(summaryResId));}/** * Returns the summary to be shown when checked. *  * @return The summary. */public CharSequence getSummaryOn() {return mSummaryOn;}/** * Sets the summary to be shown when unchecked. *  * @param summary *            The summary to be shown when unchecked. */public void setSummaryOff(CharSequence summary) {mSummaryOff = summary;if (!isChecked()) {notifyChanged();}}/** * @see #setSummaryOff(CharSequence) * @param summaryResId *            The summary as a resource. */public void setSummaryOff(int summaryResId) {setSummaryOff(getContext().getString(summaryResId));}/** * Returns the summary to be shown when unchecked. *  * @return The summary. */public CharSequence getSummaryOff() {return mSummaryOff;}/** * Returns whether dependents are disabled when this preference is on ( * {@code true}) or when this preference is off ({@code false}). *  * @return Whether dependents are disabled when this preference is on ( *         {@code true}) or when this preference is off ({@code false}). */public boolean getDisableDependentsState() {return mDisableDependentsState;}/** * Sets whether dependents are disabled when this preference is on ( * {@code true}) or when this preference is off ({@code false}). *  * @param disableDependentsState *            The preference state that should disable dependents. */public void setDisableDependentsState(boolean disableDependentsState) {mDisableDependentsState = disableDependentsState;}@Overrideprotected Object onGetDefaultValue(TypedArray a, int index) {return a.getBoolean(index, false);}@Overrideprotected void onSetInitialValue(boolean restoreValue, Object defaultValue) {setChecked(restoreValue ? getPersistedBoolean(mChecked): (Boolean) defaultValue);}@Overrideprotected Parcelable onSaveInstanceState() {final Parcelable superState = super.onSaveInstanceState();if (isPersistent()) {// No need to save instance state since it's persistentreturn superState;}final SavedState myState = new SavedState(superState);myState.checked = isChecked();return myState;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {if (state == null || !state.getClass().equals(SavedState.class)) {// Didn't save state for us in onSaveInstanceStatesuper.onRestoreInstanceState(state);return;}SavedState myState = (SavedState) state;super.onRestoreInstanceState(myState.getSuperState());setChecked(myState.checked);}private static class SavedState extends BaseSavedState {boolean checked;public SavedState(Parcel source) {super(source);checked = source.readInt() == 1;}@Overridepublic void writeToParcel(Parcel dest, int flags) {super.writeToParcel(dest, flags);dest.writeInt(checked ? 1 : 0);}public SavedState(Parcelable superState) {super(superState);}public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {public SavedState createFromParcel(Parcel in) {return new SavedState(in);}public SavedState[] newArray(int size) {return new SavedState[size];}};}}
三、使用该组件: <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><PreferenceCategory android:title="@string/openshare"><com.tmp.ftp.RadioPreferenceandroid:key="no_pwd" android:title="@string/no_pwd"android:widgetLayout="@layout/radioview" /><com.tmp.ftp.RadioPreferenceandroid:key="use_ap_pwd" android:title="@string/mobileap_username_pwd"android:widgetLayout="@layout/radioview" /><com.tmp.ftp.RadioPreferenceandroid:key="name_pwd" android:title="@string/ucustom_username_pwd"android:widgetLayout="@layout/radioview" /></PreferenceCategory></PreferenceScreen>
改类代码是仿照CheckboxBoxPrefrence类来写的。改动的部分很少。 这个自定义组件组件基本上可以使用了,但是有一个问题就是,没次启动该应用之后,所有的RadioButton都是未选中的,也就是说改组件没法自动保存,这个问题有待解决,也请大侠们指出问题所在,谢谢!!

更多相关文章

  1. Android用户界面 UI组件--自动提示输入框 AutoCompleteTextView
  2. android定义全局变量
  3. android 自定义TextView实现秒级数字时钟
  4. Android之自定义适配器
  5. android帧动画
  6. Android中自定义Dialog常用的两种方式
  7. 二十二、android中application标签说明
  8. Android(安卓)自定义充电动画
  9. android AlertDialog自定义全屏显示

随机推荐

  1. numpy无法将值分配给列的一部分
  2. python及其模块下载集合
  3. 在python中出现搜索项的打印行
  4. python基础编程_12_日期格式的使用和转换
  5. 从零开始部署Django生产环境(适用:《跟老齐
  6. python python 入门学习之网页数据爬虫cn
  7. AttributeError:'Flask'对象没有属性'logi
  8. UnicodeDecodeError: 'gb2312' codec can
  9. python输出斐波那契数列三角形
  10. 是否有一个类似于Python的“枚举”函数的