`
justdoit2000
  • 浏览: 23918 次
  • 性别: 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  
兄弟好样的

相关推荐

    Android 自定义preference组件

    上篇博文代码实现了Android自带的preference组件,本文将通过实例讲解自定义preference组件。 主要通过以下几步来实现: 1.定义需要的layout布局res-&gt;layout-&gt;xml文件; 2.通过继承Preference类,来实现自定义...

    android Preference自定义样式

    综上所述,自定义Android的Preference样式涉及到多个层次,包括使用主题、布局、视图、属性和代码动态修改。理解这些方法,开发者可以根据自己的需求为用户创造更加美观和个性化的设置界面。在实际项目中,应根据...

    自定义Preference

    在Android开发中,Preference是用来构建用户设置界面的一种组件。它提供了许多预定义的选项,如开关、选择框、单选按钮等,使得开发者能够轻松创建类似系统设置的界面。然而,有时我们可能需要自定义Preference以...

    Android中preference的使用实例代码

    在Android开发中,Preference是用来构建用户设置界面的关键组件。它允许开发者轻松地创建具有开关、选择器、输入框等交互元素的配置界面。本篇文章将深入探讨如何在Android项目中使用Preference,通过实例代码来展示...

    Android Preference解读

    在Android开发中,Preference是用于构建用户界面的一种重要组件,特别是在设置界面的实现上。它提供了许多预定义的UI元素,如开关...理解并熟练运用Preference组件,可以极大地提高Android应用的用户体验和开发效率。

    自定义preference的checkboxpreference样式

    在Android开发中,Preference是用来构建设置界面的基本组件,它提供了许多预定义的UI元素,如开关、选择框等。在本教程中,我们将深入探讨如何自定义`CheckboxPreference`的样式,以满足个性化的需求。 首先,`...

    android Preference的Demo

    在Android开发中,Preference是用于构建用户界面的一种关键组件,特别是在创建设置屏幕时。`android Preference` 是一个框架,允许开发者轻松地创建可交互的设置项,如开关、选择框、输入框等,并能将用户的设定保存...

    安卓Android源码——Preference_Demo.rar

    Preference_Demo是一个基于Android平台的源码示例,主要展示了如何在Android应用中使用Preference组件。Preference类是Android SDK提供的一种用于创建用户设置界面的工具,它允许开发者以一种声明式的方式定义设置项...

    Android应用源码之Preference_Demo-IT计算机-毕业设计.zip

    1. **Preference组件**: - `Preference`类是Android提供的一个抽象基类,用于构建设置界面中的各个选项。它可以是开关、选择列表、文本输入等不同类型的设置项。 - `PreferenceScreen`代表设置界面的整体结构,...

    android Preference Demo

    在Android开发中,Preference是一个重要的组件,用于创建用户界面,让用户可以方便地进行设置和偏好选择。Preference Demo是展示如何使用Preference进行UI设计的一个实例,它涵盖了各种类型的Preference,如开关按钮...

    Android Preference

    在Android开发中,Preference是用户界面(UI)的一个重要组件,用于创建设置界面或选项菜单。Preference Activity是Android系统提供的一种特殊类型的Activity,专门用来显示和处理用户偏好设置。在这个"Android_...

    Android-一个MaterialDesign风格的Preference

    "Android-一个MaterialDesign风格的Preference"指的是将标准的Android `Preference`组件与Material Design规范相结合,以创建更现代化、美观的设置界面。在Android开发中,`Preference`类用于构建用户设置屏幕,它...

    android 设置界面 PreferenceScreen

    虽然Android提供了多种预定义的`Preference`类型,但有时我们可能需要创建自定义的偏好设置来满足特定需求。这可以通过继承`Preference`类并覆盖其方法来实现,例如重写`onBindView()`以改变视图显示,或者重写`...

    Android学习笔记 Preference的使用

    在Android开发中,Preference是用于实现用户设置界面的关键组件,它允许用户进行简单的交互,如开关按钮、选择列表等。Preference框架提供了丰富的UI元素,并且能够轻松地将用户配置保存到共享偏好设置...

    AndroidPreferenceDemo

    【AndroidPreferenceDemo】是一个关于Android开发的示例项目,它主要展示了如何在Android应用中使用`Preference`组件来实现设置界面。`Preference`是Android SDK提供的一种用于构建用户设置界面的便捷工具,允许...

    android 探索首选项框架xxxPreference

    - 使用模拟器或真实设备测试:验证自定义Preference在不同Android版本上的表现。 6. **最佳实践**: - 分离UI和逻辑:将Preference的显示逻辑与数据处理分离,保持代码清晰。 - 使用PreferenceFragmentCompat:...

    Android-Support-Preference-V7-Fix-master.zip

    标题中的"Android-Support-Preference-V7-Fix-master"表明这是一个针对Android支持库中Preference-V7组件的修复项目。在Android开发中,Support Library(现在称为AndroidX库)是谷歌提供的一系列兼容库,用于帮助...

    android各种Preference的使用

    在Android开发中,Preference是用来构建用户界面中设置页面的关键组件,它允许用户通过简单的交互来改变应用的配置或设置。本篇文章将详细讲解如何在Android中使用各种类型的Preference,特别是ListPreference。 ...

    Android应用源码之Preference_Demo.zip

    除了基础的Preference类型,开发者还可以通过继承Preference并重写相关方法来自定义自己的Preference组件,以满足特定的UI或行为需求。 在Preference_Demo中,我们可能还会看到如何使用PreferenceFragmentCompat来...

    Pro Android学习:Preference(首选项)小例子

    在Android应用开发中,Preference是用户界面中一种重要的组件,用于提供设置界面,让用户能够配置应用的各种参数。Preference通常用于创建具有开关、选择框、输入框等交互元素的设置页面,使得用户可以方便地更改...

Global site tag (gtag.js) - Google Analytics