android preference 启动activity,Android PreferenceActivity 学习笔记

在Ap中有时需要设置一些配置参数,这些参数通过配置文件保存。

为了设置这些参数,需要提供一个UI,针对这种需求,Android提供了preferenceActivity。

PreferenceActivity通过读取预先定义的xml文件来生成界面,并能够自动的根据用户的操作来修改参数,并保存到配置文件中供读取。

1.MainActivity:

按下Menu按键弹出菜单,点击菜单启动SettingActivity。

2.SettingActivity继承自PreferenceActivity:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.settings);

}

在onCreate函数中加载参数定义文件。

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);

当参数值被改变时会调用此Listener,可以在此Listener中作一些界面刷新工作,比如当前参数值改变为新的值。

Preference android.preference.PreferenceActivity.findPreference(CharSequence key);

获取指定key所对应的preference对象,即使此key在配置文件中尚未保存,也能够得到preference对象,而不会是null。

3.settings.xml:保存在xml目中的参数定义文件,在创建Android XML文件时选择Preference即可创建一个空的参数定义文件。

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

添加一个CheckBoxPreference子项,并设置属性:

Key:checkbox_key

Title:CheckBox Item

Summary:test check box item

android:title="CheckBox Item" android:summary="test check box item">

key是用来访问此参数的值的关键字,保存后的配置文件类似如下内容:

启动Ap,点击菜单,即可看到参数设置界面,并且当用户点击操作改变了参数值后,也会被自动保存。

4.使用参数值:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

boolean check_test = sp.getBoolean("checkbox_key", false);

进阶:

1.保存参数文件的路径:

/data/data/包名/shared_prefs/包名_preferences.xml

如果想指定保存文件名,可使用:

getPreferenceManager().setSharedPreferencesName("配置文件名");

2.其他的参数配置项:

2.1 EditTextPreference:

android:key="edittext_key" android:dialogMessage="Please Input text"

android:title="EditText Item" android:summary="test edittext item">

此参数设置项会弹出一个文本输入对话框,并在配置文件中生成类似以下内容:

this is a good text

弹出对话框的图标、标题、提示信息、Icon、以及两个按钮的文本都可以设定。

至于自定义对话框的布局,虽然有这个属性,但是自定义布局后就不能自动保存值了,

本来以为只要放一个ID和原来一样的EditText就能,但是查看源代码,发现其EditText是new出来的,没法替代。

2.2 PreferenceCategory:一个分类分隔条。只有title属性有效。

2.3 PreferenceScreen:此项包含的所有子项在新屏幕上显示,就好像进入二级菜单。

2.4 ListPreference:会弹出一个列表对话框供选择。

2.5 RingtonePreference:会弹出系统铃声列表供选择。

2.6 Preference:通用参数项。点击后需要程序自己响应事件。

3.自定义选项:

系统的提供的界面有时不能满足需要,这时就需要自定义选项了。

有两种方法可以实现自定义选项,一是用Preference作为选项,并重新实现onPreferenceTreeClick函数。

一是自定义一个类,类似于EditTextPreference这种系统内置的类,然后引用。

3.1使用一个Preference占位,然后重新实现onPreferenceTreeClick()函数:

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {

String key = preference.getKey();

if( key != null ){

if(key.equals("some_key")) {

showDialog(DIALOG_SOME_KEY);

}

}

return super.onPreferenceTreeClick(preferenceScreen, preference);

}

当点击指定key的Preference时,就会弹出对话框,然后在合适的时机使用如下代码保存参数即可。

SharedPreferences.Editor editor = preference.getEditor();

editor.putLong("ttt", 123);

editor.commit();

此种方法如果要触发onSharedPreferenceChanged(),可以通过preference.getOnPreferenceChangeListener()获取listener然后来呼叫。

3.2自定义选项类:

此处以一个选择时间的对话框选项为例。

3.2.1 从DialogPreference继承一个类:

public class TimePreference extends DialogPreference

3.2.2 构造函数:

public TimePreference(Context context, AttributeSet attrs) {

super(context, attrs);

setDialogLayoutResource(R.layout.time_preference);//加载布局文件

}

3.3.3 布局文件:

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

android:layout_width="fill_parent"

android:layout_height="fill_parent">

定义了一个id为timePicker_preference的TimePicker。

3.3.4 界面初始化:在dialog的函数中通过id找到TimePicker,然后使用已经存储的值或者默认值,再设置到TimerPicker中。

@Override

protected void onBindDialogView(View view) {

super.onBindDialogView(view);

mPicker = (TimePicker)view.findViewById(R.id.timePicker_preference);

if(mPicker != null) {

mPicker.setIs24HourView(true);

long value = mValue;

Date d = new Date(value);

mPicker.setCurrentHour(d.getHours());

mPicker.setCurrentMinute(d.getMinutes());

}

}

3.3.5 保存值:在对话框关闭时保存值。

@Override

protected void onDialogClosed(boolean positiveResult) {

super.onDialogClosed(positiveResult);

if(positiveResult) {

Date d = new Date(0, 0, 0, mPicker.getCurrentHour(), mPicker.getCurrentMinute(), 0);

long value = d.getTime();

if(callChangeListener(value)) {

setValue(value);

}

}

}

3.3.6 使用此preference:

在参数定义文件中增加:

类似于使用自定义控件。

运行即可看到效果:

f433e3c79117b4dcc7031cb5f11c382a.png

3.3.7 使用默认值:

在参数定义文件中增加一个定义:

并且自定的preference类中要实现两个函数:

@Override

protected Object onGetDefaultValue(TypedArray a, int index) {

return a.getString(index);

}

以及

@Override

protected void onSetInitialValue(boolean restorePersistedValue,Object defaultValue) {

long value;

if(restorePersistedValue) value = getPersistedLong(0);

else {

value = Long.parseLong(defaultValue.toString());

}

setValue(value);

}

当PreferenceActivity启动时会构造TimePreference,此时会调用onGetDefaultValue,然后调用onSetInitialValue,在onSetInitialValue保存初始值,并在onBindDialogView中使用保存的值从而可以使用默认值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值