`
justdoit2000
  • 浏览: 23663 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

自定义android preference组件

阅读更多

 

       今天用到了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);
	}

	@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 = 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.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> 
  
  改类代码是仿照CheckboxBoxPrefrence类来写的。改动的部分很少。
  这个自定义组件组件基本上可以使用了,但是有一个问题就是,没次启动该应用之后,所有的RadioButton都是未选中的,也就是说改组件没法自动保存,这个问题有待解决,也请大侠们指出问题所在,谢谢!!
  • 大小: 67.5 KB
分享到:
评论
4 楼 wj19890216 2015-08-14  
你能将这代码发给我吗?我设置了title,但是无法show 出来。
3 楼 kriswu 2011-01-24  
ListPreference 本身就支持单选的。。。
2 楼 liu03103035 2011-01-21  
Thanks for sharing!!
1 楼 wen0006 2010-12-07  
兄弟好样的

相关推荐

Global site tag (gtag.js) - Google Analytics