Preference 使用详解

摘要:
性能介绍如何使用性能定义首选项使用XML定义性能使用片段实现效果性能是Android中的重要控件之一。

Preference 使用详解第1张

极力推荐文章:欢迎收藏
Android 干货分享

Preference 使用详解第2张

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

  1. Perference 简介
  2. Perference 使用方法
  3. 使用XML定义Preference
  4. 使用Fragment 定义Preference
  5. 实现效果

PreferenceAndroid 中重要的控件之一,比如 Settings 模块大部分都是通过Preference 实现的,本章将研究preference 使用方法

1.Preference 简介

Preference 继承关系

java.lang.Object
    ↳ android.preference.Preference 

Preference 常用于APP 设置模块,比如 Android 系统中的Settings 模块,它可以默认把我们的数据保存在SharePreference中。

 settings中常用Preference 举例

  • 键值对(key-values) 获取方法同 SharePreference
		SharedPreferences	mSp = PreferenceManager.getDefaultSharedPreferences(this);
		String favPhone = mSp.getString(PREF_LISTPHONE, "MI");

  • Preference 数据保存

Preference通过key-values 键值对的形式保存。
保存路径如下:
/data/data/包名/shared_prefs/包名_preferences.xml

Preference 数据保存路径

2. Perference 使用方法

一般在XML文件夹中创建xml 文件来对Settings进行布局,布局文件中通常使用PreferenceScreen容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类标题。

常用Preference 控件如下:
PreferenceScreen
CheckBoxPreference
EditTextPreference
ListPreference
PreferenceCategory
RingtonePreference.

上面控件等同Layout布局中的ViewPreferenceScreen 等同Layout布局中的ViewGroup。在Android 3.0 之前需要继承PreferenceActivity(此方法不是太推荐使用,已被启用),3.0 之后更高版本,则需要继承Activity,使用Fragment 控制布局,然后实现不同控件的处理事件。

Perference 常用使用方法如下两种:

    1. 使用XML定义Preference
    1. 使用Fragment 定义Preference
3. 使用XML定义Preference

此方法有点过时,不太建议使用,但目前还可以用。
其使用方法如下:

  1. XML 文件保存在res/xml/目录中 例如: preferences.xml
  2. 继承PreferenceActivity onCreate方法中直接调用addPreferencesFromResource(R.xml.preference);添加布局
  3. 点击事件处理setOnPreferenceClickListener ,内容发生改变事件处理 setOnPreferenceChangeListener

Preference使用案例如下:
res /xml /preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <SwitchPreference
        android:key="sw_perference"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />

    <CheckBoxPreference
        android:defaultValue="true"
        android:icon="@null"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle"
        android:widgetLayout="@layout/test" />

    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />

        <ListPreference
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    </PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />

    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </Preference>
    </PreferenceScreen>

</PreferenceScreen>

Activity 处理方法

public class PreferenceMethods extends PreferenceActivity implements
		OnPreferenceClickListener, OnPreferenceChangeListener {

	public static final String PREF_BLUE = "pref_blue";
	public static final String PREF_LISTPHONE = "pref_fav_phone";
	public static final String PREF_CITY = "fav_city";
	public static final String PREF_RING = "pref_ring";

	private CheckBoxPreference mBlueCheckPreference;
	private ListPreference mFavPhoneListPreference;
	private EditTextPreference mFavCityEdPreference;
	private RingtonePreference mRingtonePreference;
	private SwitchPreference mSwitchPreference;
	private SharedPreferences mSp;
	boolean isCheck;

	@SuppressLint("NewApi")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.preference);
		mSp = PreferenceManager.getDefaultSharedPreferences(this);

		isCheck = mSp.getBoolean(PREF_BLUE, true);
		String favPhone = mSp.getString(PREF_LISTPHONE, "MI");

		mBlueCheckPreference = (CheckBoxPreference) findPreference(PREF_BLUE);
		mFavPhoneListPreference = (ListPreference) findPreference(PREF_LISTPHONE);
		mFavCityEdPreference = (EditTextPreference) findPreference(PREF_CITY);
		mRingtonePreference = (RingtonePreference) findPreference(PREF_RING);
		mSwitchPreference = (SwitchPreference) findPreference("sw_perference");
		// mSwitchPreference.setEnabled(false);
		mSwitchPreference.setChecked(true);
		mSwitchPreference.setShouldDisableView(true);

		mFavPhoneListPreference.setSummary("dddd");
		mFavPhoneListPreference.setOnPreferenceClickListener(this);
		mFavPhoneListPreference.setOnPreferenceChangeListener(this);
		mFavPhoneListPreference.setValueIndex(3);

		mBlueCheckPreference.setChecked(isCheck);
		mBlueCheckPreference.setOnPreferenceClickListener(this);
		mBlueCheckPreference.setOnPreferenceChangeListener(this);

		String favCity = mSp.getString(PREF_CITY, "成都");
		mFavCityEdPreference.setOnPreferenceClickListener(this);
		mFavCityEdPreference.setOnPreferenceChangeListener(this);
		mFavCityEdPreference.setSummary(favCity);

		String favRingtone = mSp.getString(PREF_RING, "十年");
		mRingtonePreference.setSummary(favRingtone);
		mRingtonePreference.setOnPreferenceChangeListener(this);
		mRingtonePreference.setOnPreferenceClickListener(this);
	}

	@Override
	public boolean onPreferenceClick(Preference preference) {
		return true;
	}

	@Override
	public boolean onPreferenceChange(Preference preference, Object newValue) {

		if (mBlueCheckPreference.equals(preference)) {
			isCheck = !isCheck;
			mBlueCheckPreference.setChecked(isCheck);
		}

		if (mFavPhoneListPreference.equals(preference)) {
			mFavPhoneListPreference.setSummary(newValue.toString());
		}

		if (mFavCityEdPreference.equals(preference)) {
			mFavCityEdPreference.setSummary(newValue.toString());
		}
		if (preference.equals(mRingtonePreference)) {

			mRingtonePreference.setSummary(newValue.toString());
		}
		return true;
	}
}
4. 使用Fragment 定义Preference

此方法比较建议是使用,如需了解Fragment 使用方法,请看Fragment 使用详解

    1. 首先自定Fragment片段

a.自定义 SettingsFragment

public class SettingsFragment extends PreferenceFragment {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Load the preferences from an XML resource
		addPreferencesFromResource(R.xml.preference);
	}
}

b.preference 实现

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <SwitchPreference
        android:key="sw_perference"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />

    <CheckBoxPreference
        android:defaultValue="true"
        android:icon="@null"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle"
        android:widgetLayout="@layout/test" />

    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />

        <ListPreference
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    </PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />

    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </Preference>
    </PreferenceScreen>

</PreferenceScreen>
    1. Activity 中调用Fragment
public class SettingPreferenceActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_preference);

		getFragmentManager().beginTransaction()
				.replace(R.id.fm_pref, new SettingsFragment()).commit();
	}

}
  • 填充布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android: 
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
5.实现效果如下:

Preference使用方法详解

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

微信关注公众号: 程序员Android,领福利

免责声明:文章转载自《Preference 使用详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java面试,如何在短时间内做突击(转)postman安装及简单使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vsnprintf

http://www.cplusplus.com/reference/cstdio/vsnprintf/ int vsnprintf (char * s, size_t n, const char * format, va_list arg ); Write formatted data from variable argument list to siz...

在Eclipse中使用JUnit4进行单元测试(图文教程一)

在Eclipse中使用JUnit4进行单元测试    单元测试,JUnit4。    这两个有什么关系呢?这就好比(草)单元测试和(割草机)。用这个JUnit4工具去辅助我们进行测试。其实不理解这个也没关系,听多了见多了用多了,自然而然地就会懂了。    有人可能会想,那我直接自己编写个测试的方法不就可以了。例如写个System.out.print输出,看...

C#发送邮件(使用SSL,587端口)

static readonly string smtpServer = System.Configuration.ConfigurationManager.AppSettings["SmtpServer"]; static readonly string userName = System.Configuration.Configurati...

systabcontrol32

private void SelectTab() { IntPtr hand1 = FindWindowA(null, "EPSON R330 Series 打印首选项"); if (hand1 != IntPtr.Zero) {...

springboot+shrio简易登录登出和用户权限认证。

源码:https://github.com/huangshengz/myJavaDemo本例子参考:https://www.cnblogs.com/HowieYuan/p/9259638.html本例子验证主要有两个类,一个是自定义的拦截类ShiroConfig,在这里我们自定义了很多需要的操作。例如:角色权限路径,登录路径等,一些具体的含义如下: * a...

vb mid函数的使用方法详细介绍

mid函数从字符串中返回指定数量的字符。 语法 Mid(string, start[, length]) 对语法的理解就是:返回string中从start开始的后面的length长度的字符串 string是必需的参数,如果string包含Null,返回结果也将是Null。 start必需的参数,string中被取出部分的字符位置。需要注意的是如果start超...