今天用到了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定义全局变量
  2. android 自定义TextView实现秒级数字时钟
  3. Android之自定义适配器
  4. Android Services组件
  5. Android中自定义Dialog常用的两种方式
  6. Android 自定义充电动画
  7. android AlertDialog自定义全屏显示
  8. Android 自定义标题栏Title Bar
  9. Toast大全(默认,顶部,底部,各种自定义) Android

随机推荐

  1. Android(安卓)UI开源框架
  2. Realtek 8192cu 支持 Android Hotspot 软
  3. android studio ndk编译问题
  4. Android联系人数据库全解析(5)
  5. android layouts之RelativeLayout
  6. react-native APP图标和Splash(Android)
  7. 移植android的工作环境
  8. 2015-10-30-02-Android Theme主题使用心
  9. Android 重力感应 翻转页面造成Activity
  10. android ListView向下展开 抽屉效果