现在的位置: 首页 > 综合 > 正文

Android中PreferenceFregment使用完全攻略

2013年10月27日 ⁄ 综合 ⁄ 共 5497字 ⁄ 字号 评论关闭
文章目录

提要

       如果你从搜索引擎找到这篇文章,那么恭喜你,你来对地方了。我可以很负责任的告诉你,在这篇文章之前,没有一篇完整叙述PreferenceFregment使用的完整文章。

       在android的应用中通常都有setting功能,能够设置一些全局的选项,例如字体颜色,个人喜好等等。

       这些东西都是存在一个xml中的,在android中对应的对象就是SharedPreferences。

       下面就是一个完整使用PreferenceFregment的例子,先看结果:

PreferenceFragment 还是 PreferenceActivity

       很明显PreferenceFragment 是Fregment, PreferenceActivity是Activity。

       当你的应用针对的系统在3.0以上的时候,你就应该用PreferenceFragment,现在主流系统4.0的情况下,当然选择使用PreferenceFragment。原因是PreferenceFragment是一个更加平滑的结构,你可以将它依附在任何的activity上面,谷歌强力推荐使用PreferenceFragment!

 常用Preference

CheckPreference —— CheckBox 单选框
EditTextPreference —— EditText 输入文本框
ListPreference —— ListView 列表框
RingtonePreference —— 选择铃声

 XML定义常用的属性有:

android:key : 每个Preference控件独一无二的”ID”,唯一表示此Preference。
android:defaultValue : 默认值。 例如,CheckPreference的默认值可为”true”,默认为选中状态;
EditTextPreference的默认值可为”110” 。
android:enabled : 表示该Preference是否可用状态。
android:title : 每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary : 每个Preference在PreferenceScreen布局上显示的标题——小标题(可以没有)

ListPreference中:

android:entries:类型为array,控件欲显示的文本
android:entryValues:类型为array,与文本相对应的key-value键值对,value保存至sharedPreference文件

PreferenceFragment 使用步骤

1.定义preference

在项目的res/xml中新建一个preferences.xml.用于定义菜单界面的设置选项:

<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
            android:title="PreferenceCategory A">

        <CheckBoxPreference
                android:key="checkbox_preference"
                android:title="title_checkbox_preference"
                android:summary="summary_checkbox_preference" />

    </PreferenceCategory>

    <PreferenceCategory
            android:title="PreferenceCategory B">

        <EditTextPreference
                android:key="edittext_preference"
                android:title="title_edittext_preference"
                android:summary="null"  
                android:dialogTitle="dialog_title_edittext_preference"
                android:defaultValue="null" />

        <ListPreference  
            android:dialogTitle="Choose font"  
            android:entries="@array/pref_font_types"  
            android:entryValues="@array/pref_font_types_values"  
            android:key="list_preferenc"  
            android:summary="sans"  
            android:title="Font" 
            android:defaultValue="sans"/> 
    </PreferenceCategory>

</PreferenceScreen>

android:entries 和 android:entryValues 定义在res/values/strings.xml中

    <string name="app_name">AndroidPreferenceFragment</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
    
    <string-array name="pref_font_types">
        <item>sans</item>
        <item>serif</item>
        <item>monospace</item>
        <item>Yahei</item>
    </string-array>
    <string-array name="pref_font_types_values">
        <item>sans</item>
        <item>serif</item>
        <item>monospace</item>
        <item>Yahei</item>
    </string-array>

2.创建一个activity用于给PreferenceFragment 依附

package com.example.androidpreferencefragment;

import android.app.Activity;
import android.os.Bundle;

public class SetPreferenceActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		getFragmentManager().beginTransaction().replace(android.R.id.content,
                new PrefsFragment()).commit();
	}

}

3.创建PreferenceFragment

package com.example.androidpreferencefragment;

import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.Preference.OnPreferenceChangeListener;

@SuppressLint("NewApi")
public class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener{

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

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

	@Override
	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
		// TODO Auto-generated method stub
		// Set summary to be the user-description for the selected value
		if(!key.equals(MainActivity.PRF_CHECK))
		{
			Preference connectionPref = findPreference(key);
			connectionPref.setSummary(sharedPreferences.getString(key, ""));
		}
	}

	@Override
	public void onResume() {
		super.onResume();
		getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

	}

	@Override
	public void onPause() {
		getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
		super.onPause();
	}

}

          implements OnSharedPreferenceChangeListener 是用于监听SharedPreference是否改变的。这里主要的作用是当SharedPreference改变的时候及时更新界面中preference的summary,提供一个更好的交互。注意在OnResume和OnPause中要注册和卸载监听器,维护activity中的生命周期。

          注:不能给每个preference设置OnChangeListener来更新界面中preference的summary,这样会阻止系统存储preference.xml.

4.设置默认

        当用户第一次运行应用的时候,用户还没有设置自己preference,这时候就要指定默认的prefernnce了。

        首先在xml定义好android:defaultValue项。然后在主Activity(也可以是其他activity,但在第一次运行的时候一定会进去,比如闪屏Activity)的onCreate方法中调用setDefaultValues方法。

       

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

这个函数有三个参数:

第一个为应用上下文,第二个是preference的id,第三个为false指只在第一次运行的时候加载默认值。

5.取出preference值

SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

然后通过get方法和key值就可以取出对应的值了,比如:

boolean my_checkbox_preference = mySharedPreferences.getBoolean("checkbox_preference", false);
String my_edittext_preference = mySharedPreferences.getString("edittext_preference", "");

代码下载

android工程

参考

Settings - https://developer.android.com/guide/topics/ui/settings.html#Defaults

How to listen for preference changes within a PreferenceFragment? - http://stackoverflow.com/questions/13596250/how-to-listen-for-preference-changes-within-a-preferencefragment

Example of using PreferenceFragment - http://android-er.blogspot.com/2012/07/example-of-using-preferencefragment.html

抱歉!评论已关闭.