PreferenceFragment记录用户喜好
来源:互联网 发布:音频剪辑软件哪个好 编辑:程序博客网 时间:2024/05/16 04:43
利用PreferenceFragment 记录用户喜好,当用户打开程序时,首先弹出对话框(该PreferenceFragment 加载的layout),进入个人喜好,个人信息输入界面,
当填完信息后,所有的数据保存在/data/data/程序名/shared_prefs/xxxx_preferences.xml里面。 可以单独写一个preference的类,当程序打开时,利用该preference
去xxxx_preferences.xml文件里面读取相应的数据,然后存储在类里面,这样提高读数据的时间。
一. 利用Fragment的replace()函数加载PreferenceFragment
getFragmentManager().beginTransaction().replace(R.id.main_frame_container, new SettingsFragment(), SettingsFragment.class.getName())
.addToBackStack(SettingsFragment.class.getName()).commit();
关于replace()函数的参数
1. 第一个参数是要加载到的区域,虽然是函数名是replace,但是这个区域被替代前可以不是fragment.
2. 第二个参数是要加载的fragment
3. 第三个参数是这个fragment的ID, 便于以后查找fragment.
二.创建PreferenceFragement 类
1. override the function onCreate()函数,添加layout, 给layout中的sub-fragment 添加listener事件。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource, 加载布局文件
addPreferencesFromResource(R.xml.preference);
//add listener and set summary as the default value from /data/date/....xxx.xml
//the summary is the display value
//给sub-fragment(提示控件)添加监听事件,并且从/data/data/程序名/shared_prefs/xxxx_preferences.xml读取default的值
//修改summary(显示的值)英default的值
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_USERNAME));
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_SECQUESTION));
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_TAILTEXT));
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_TAILURL));
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_BLANKLIST_USERNAMES));
bindPreferenceSummaryToValue(findPreference(HiSettingsHelper.PERF_TEXTSIZE_POST_ADJ));
}
1.1 关于布局文件。创建xml文件夹,然后创建preference.xml文件。 在文件中定义了EditTextPreference, ListPreference, SwitchPreferecn, and DialogPreference.
所有的preference都包含在PreferenceScreen里面,可以用PreferenceCategory来分块。
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><PreferenceCategory android:title="@string/pref_category_account" > <EditTextPreference android:inputType="text" android:key="PERF_USERNAME" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_username" /> <EditTextPreference android:inputType="textPassword" android:key="PERF_PASSWORD" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_password" /> <EditTextPreference android:inputType="text" android:key="PERF_SECANSWER" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_login_answer" /> <ListPreference android:defaultValue="0" android:entries="@array/pref_login_question_list_titles" android:entryValues="@array/pref_login_question_list_values" android:key="PERF_SECQUESTION" android:negativeButtonText="@null" android:positiveButtonText="@null" android:title="@string/pref_title_login_question" /> </PreferenceCategory> <PreferenceCategory android:title="@string/pref_category_tail" > <SwitchPreference android:defaultValue="true" android:key="PERF_ADDTAIL" android:title="@string/pref_title_add_tail" /> <EditTextPreference android:defaultValue="@string/default_tail_text" android:inputType="text" android:key="PERF_TAILTEXT" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_tail_text" /> <EditTextPreference android:defaultValue="@string/default_tail_url" android:inputType="text" android:key="PERF_TAILURL" android:maxLines="1" android:selectAllOnFocus="true" android:singleLine="true" android:title="@string/pref_title_tail_url" /> </PreferenceCategory> <PreferenceCategory android:title="@string/pref_category_ui" > <SwitchPreference android:defaultValue="false" android:key="PERF_EINK_OPTIMIZATION" android:title="@string/pref_title_eink_optimization" /> <ListPreference android:defaultValue="0" android:entries="@array/pref_post_textsize_adjust_titles" android:entryValues="@array/pref_post_textsize_adjust_values" android:key="PERF_TEXTSIZE_POST_ADJ" android:negativeButtonText="@null" android:positiveButtonText="@null" android:title="@string/pref_post_textsize_adjust_title" /> </PreferenceCategory> <PreferenceCategory android:title="@string/pref_category_general" > <SwitchPreference android:defaultValue="false" android:key="PERF_ENCODEUTF8" android:title="@string/pref_title_encode_utf8" /> <EditTextPreference android:inputType="text" android:key="PERF_BLANKLIST_USERNAMES" android:maxLines="1" android:selectAllOnFocus="false" android:singleLine="true" android:title="@string/pref_title_blanklist" /> <net.jejer.hipda.ui.AboutDialogPreference android:summary="@string/app_versionName" android:title="@string/pref_title_about" /> </PreferenceCategory></PreferenceScreen>
<1>关于EditTextPreference
inputType: 输入类型,如果是textPassword, 用户输入一个字符后,后变成黑点。如果是phone,会自动调出数字键盘
key:是该preference的indicator, 也是通过该值到xxx_preference.xml里面查找相应的变量值。
title: 弹出来的控件的标题。
<2>ListPreference
entries: 弹出的List中每个Item显示的值,必须是string-array
entryValues: 弹出的List中每个Item的标号
<3>SwitchPreference
defaultValue: 默认的值
<4>这里自己定义了一个DialogPreference
a. override 函数onCreateDialogView()来加载layout, 改layout只用webview这个控件。
protected View onCreateDialogView () {
Log.v(LOG_TAG, "onCreateDialogView");
//return null;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
return inflater.inflate(R.layout.dialog_about, null);
}
b. override 函数onBindDialogView()来显示view的信息
@Override
protected void onBindDialogView (View view) {
Log.v(LOG_TAG, "onBindDialogView");
WebView wv = (WebView)view;
wv.loadUrl("file:///android_asset/html/about.html");
}
这里贴出整个类的code
public class AboutDialogPreference extends DialogPreference {private final String LOG_TAG = getClass().getSimpleName();public AboutDialogPreference(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overrideprotected View onCreateDialogView () {Log.v(LOG_TAG, "onCreateDialogView");//return null;LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);return inflater.inflate(R.layout.dialog_about, null);}@Overrideprotected void onBindDialogView (View view) {Log.v(LOG_TAG, "onBindDialogView");WebView wv = (WebView)view;wv.loadUrl("file:///android_asset/html/about.html");}}
2.1 类 函数findPreference(HiSettingsHelper.PERF_USERNAME)
是在此PreferenceFragment加载的preference群中查找, 通过key值来查找。
2.2 自定义函数bindPreferenceSummaryToValue(Preference);
用于为sub-preference添加监听事件,并把summary的值修改为default 值(从xxxx_preference.xml读取的值)
private static void bindPreferenceSummaryToValue(Preference preference) {// Set the listener to watch for value changes.preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);// Trigger the listener immediately with the preference's// current value.if (preference instanceof CheckBoxPreference) {sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getBoolean(preference.getKey(),false));} else if (preference instanceof SwitchPreference) {sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getBoolean(preference.getKey(),false));} else {sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(),""));}}
2.3 利用Preference.OnPreferenceChangeListener作为listenner
由于ListPreference 和其他的preference的setsummary()函数不一样,所以分开写。
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object value) {String stringValue = value.toString();if (preference instanceof ListPreference) {// For list preferences, look up the correct display value in// the preference's 'entries' list.ListPreference listPreference = (ListPreference) preference;int index = listPreference.findIndexOfValue(stringValue);// Set the summary to reflect the new value.preference.setSummary(index >= 0 ? listPreference.getEntries()[index]: null);} else {// For all other preferences, set the summary to the value's// simple string representation.preference.setSummary(stringValue);}return true;}};
- PreferenceFragment记录用户喜好
- android 保存用户喜好设置
- 喜好
- PreferenceFragment
- PreferenceFragment
- 电子邮件组中用户喜好调研数据
- 用户读书喜好推荐数据分析
- 苹果新专利:通过面部识别判断用户喜好(图)
- 卫报:如何预测用户对某首歌曲的喜好
- 碎步一:根据用户喜好选择不同背景图(背景选择器)
- Android学习记录:PreferenceActivity和PreferenceFragment,返回主界面
- 对于相同喜好的用户,电商高手用Spark MLlib代码如何操作?
- PreferenceFragment,PreferenceActivity
- PreferenceFragment详解
- PreferenceFragment详解
- PreferenceFragment PreferenceScreen
- preferenceFragment使用
- Android PreferenceFragment
- 启动android项目无法成功解决办法
- iOS故障排除指南:基本技巧
- HDU 2033 人见人爱A+B
- Excel下2048的实现
- 一个操作系统的实现——进程
- PreferenceFragment记录用户喜好
- C++对象初始化
- js日期格式化,easy-ui,datebox得到日期改变格式
- 2014-11-30 MySQL指定数据文件存储路径DATA DIRECTORY 和 INDEX DIRECTORY
- Android入门——布局
- android:windowSoftInputMode属性详解
- an error has occurred,see the log file
- 黑马程序员——JAVA基础---方法递归,遍历全路径
- nyoj28大数阶乘