自定义android RadioPreference组件

作者:jxnktjlfr

标签: android RadioPreference Preference OPhone开发评论(0) ┆ 阅读(9)

今天用到了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类:

Java代码 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); } @Override public boolean isPersistent() { return false; } @Override protected 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)); } } } @Override protected 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; } @Override public 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; } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getBoolean(index, false); } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { setChecked(restoreValue ? getPersistedBoolean(mChecked) : (Boolean) defaultValue); } @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { // No need to save instance state since it's persistent return superState; } final SavedState myState = new SavedState(superState); myState.checked = isChecked(); return myState; } @Override protected void onRestoreInstanceState(Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { // Didn't save state for us in onSaveInstanceState super.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; } @Override public 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 = newParcelable.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.RadioPreference android:key="no_pwd" android:title="@string/no_pwd" android:widgetLayout="@layout/radioview" /> <com.tmp.ftp.RadioPreference android:key="use_ap_pwd" android:title="@string/mobileap_username_pwd" android:widgetLayout="@layout/radioview" /> <com.tmp.ftp.RadioPreference android:key="name_pwd" android:title="@string/ucustom_username_pwd" android:widgetLayout="@layout/radioview" /> </PreferenceCategory> </PreferenceScreen>

更多相关文章

  1. Android中自定义属性的使用
  2. Android当中的SeekBar与iOS中的UISlider 功能一致
  3. android中shape
  4. Android预定义样式
  5. 修改官方Twitter For Android,自定义 API
  6. Android中自定义TextView的形状--圆形-椭圆形-圆角矩形-线条
  7. Android(安卓)UI线程和非UI线程
  8. Android(安卓)View 属性大全
  9. 善用Android预定义样式

随机推荐

  1. Anroid使用DefaultHttpClient访问Wap网络
  2. WebView的基本使用方法及 WebViewClient
  3. android 5.0 以上获取栈顶应用包名以及程
  4. android中AppWidgetManager
  5. Android(安卓)动画系统汇总
  6. 如何用 Gradle 构建 Android(安卓)工程项
  7. 自己动手编译Android(LineageOS)源码
  8. MTK(Android(安卓)N)设置SDCard为默认存储
  9. protobuf使用(一)android ndk 编译 protobu
  10. MediaPlayer介绍