自定义android preference组件
16lz
2021-12-04
今天用到了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都是未选中的,也就是说改组件没法自动保存,这个问题有待解决,也请大侠们指出问题所在,谢谢!!
更多相关文章
- Android用户界面 UI组件--自动提示输入框 AutoCompleteTextView
- android定义全局变量
- android 自定义TextView实现秒级数字时钟
- Android之自定义适配器
- android帧动画
- Android中自定义Dialog常用的两种方式
- 二十二、android中application标签说明
- Android(安卓)自定义充电动画
- android AlertDialog自定义全屏显示