您的位置:首页 > 移动开发 > Android开发

Android基础学习之Preference(配置存储)

2015-10-05 20:18 597 查看
Preference 类 用来定义首选项,并向用户显示设置界面。

使用Preference可以自动帮助我们对配置页的自动存储功能。配置文件存放位置:/data/data/应用包名/shared_prefs/xxx.xml

示例:

首先编写我们的配置布局文件xxx.xml,文件放在工程目录res/xml/下,如:res/xml/xxx.xml。

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

<PreferenceCategory android:title="我的位置源" >
<CheckBoxPreference
android:key="wireless_network"
android:summary="使用无线网络查看应用程序(例如Google地图)中的位置"
android:title="使用无线网络" />
<CheckBoxPreference
android:key="gps_satellite_setting"
android:summary="定位时,精确到街道级别(取消选择可节约电量)"
android:title="启用GPS卫星设置" />
</PreferenceCategory>
<PreferenceCategory android:title="个人信息设置" >
<CheckBoxPreference
android:key="yesno_save_individual_info"
android:title="是否保存个人信息" />

<EditTextPreference
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="设置姓名"
android:key="individual_name"
android:summary="请输入真实姓名"
android:title="姓名" />

<PreferenceScreen
android:key="other_individual_msg"
android:summary="是否工作、手机"
android:title="其他个人信息" >
<CheckBoxPreference
android:key="is_an_employee"
android:title="是否工作" />

<EditTextPreference
android:key="mobile"
android:summary="请输入真实的手机号"
android:title="手机" />
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="背景音乐" >
<ListPreference
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="音乐开关"
android:entries="@array/bksound_list_preference"
android:entryValues="@array/bksoundvalue_list_preference"
android:key="bksoundlist"
android:summary="点击设置背景音乐"
android:title="背景音乐设置" />
</PreferenceCategory>

</PreferenceScreen>


背景音部分列表项内容用到的数组列表资源,文件名为array.xml,文件位置:工程目录/res/values/array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="bksound_list_preference">
<item>音乐开</item>
<item>音乐关</item>
</string-array>
<string-array name="bksoundvalue_list_preference">
<item>music_on</item>
<item>music_off</item>
</string-array>
</resources>


解析:

一个配置显示屏标签,一个 < PreferenceScreen>标签为一个显示页面。

<PreferenceScreen>
</PreferenceScreen>


一个分组标签,将几个控件分为一个组,可以嵌套PreferenceScreen,点击后进入到另一个显示屏

<PreferenceCategory>
</PreferenceCategory>


UI控件:CheckBoxPreference 选项, EditTextPreference 文本编辑框, ListPreference 单选项(类似radiobutton)等

一般用标记

<CheckBoxPreference
android:key="yesno_save_individual_info"
android:title="是否保存个人信息" />

<EditTextPreference
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="设置姓名"
android:key="individual_name"
android:summary="请输入真实姓名"
android:title="姓名" />
<ListPreference
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="音乐开关"
android:entries="@array/bksound_list_preference"
android:entryValues="@array/bksoundvalue_list_preference"
android:key="bksoundlist"
android:summary="点击设置背景音乐"
android:title="背景音乐设置" />


常见属性:

android:key 编程用 类似id

android:summary 摘要

android:title 标题

android:dialogTitle 对话框标题

android:entries 设置列表项的内容

android:entryValues 设置每个列表项的值

实现方式1:

使用Activity,需要继承自PreferenceActivity,并重写onPreferenceTreeClick方法。

public class MyPreferenceActivity extends PreferenceActivity {

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

getPreferenceManager().setSharedPreferencesName("setting"); // 指定SharedPreferences的文件名(存储文件名)
this.addPreferencesFromResource(R.xml.config); // 加载定义xml配置界面的文件

/*以下是对配置界面文件中指定UI控件的操作-------------->>*/
// 从PreferenceActivity容器中获得SharedPreferences对象
// 用key来找配置界面中UI对象
Preference preference = this.findPreference("mobile");
SharedPreferences sp = preference.getSharedPreferences();

// 通过键值找对应的值
Log.e("ql debug",String.valueOf(sp.getString("individual_name", "no name")));
Log.e("ql debug",String.valueOf(sp.getBoolean("is_an_employee", false)));

final Preference namepf = this.findPreference("individual_name");// 通过键值找到对象
namepf.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
namepf.setSummary(newValue.toString());
return true; // 更新状态
}
});
}

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
// 可针对配置界面中所有的UI来设置
if (preference.getKey().equals("yesno_save_individual_info")) {
//把相应控件设置为不可操作
findPreference("individual_name").setEnabled(!findPreference("individual_name").isEnabled());
}
Toast.makeText(this, preference.getKey(), 0).show();
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}


实现方式2

使用碎片,避免使用单一继承的局限性。

首先,创建PreferenceFragment的子类,用于对配置xml文件的各项操作

public class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesName("setting2"); // 指定SharedPreferences的文件名
// 加载定义xml配置界面的文件
addPreferencesFromResource(R.xml.config);

/*以下是对配置界面文件中指定UI控件的操作-------------->>
通过key找到控件,进行指定操作
*/
// 从PreferenceActivity容器中获得SharedPreferences对象
// 用key来找配置界面中UI对象
Preference preference = this.findPreference("mobile");
SharedPreferences sp = preference.getSharedPreferences();

// 通过键值找对应的值
Log.e("ql debug", String.valueOf(sp.getString("individual_name", "no name")));
Log.e("ql debug", String.valueOf(sp.getBoolean("is_an_employee", false)));

final Preference namepf = this.findPreference("individual_name");// 通过键值找到对象
namepf.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
namepf.setSummary(newValue.toString());
return true; // 更新状态
}
});
}
}


然后,由于碎片不能单独存在,需要界面进行显示,创建承载碎片的活动。

活动布局,使用了帧布局的父容器

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" >

<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</FrameLayout>

</RelativeLayout>


将布局和碎片进行绑定

public class MyPreferenceFragmentActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//方法1
setContentView(R.layout.preference_frag); //绑定活动布局
//获取碎片管理器并开始事务,绑定和提交
getFragmentManager().beginTransaction()
.add(R.id.frameLayout, new MyPreferenceFragment()).commit(); //绑定PreferenceFragment给父容器,并提交

//方法2
//      getFragmentManager().beginTransaction()
//      .replace(android.R.id.content,new MyPreferenceFragment()).commit();//直接绑定给系统,不需要自己的视图
}
}


效果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Preference 存储