1.PreferenceActivity 介绍
PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的状态持久化储存,举个例子 比如用户选中checkbox后 退出应用然后在进入应用,这时用户希望看到的是checkbox被选中,所以软件须要记录用户每次操作的过程并且持久储存,在进入应用的时候须要判断这些 久储存的数据然后将系统控件的状态呈现在UI中。
尤其是软件开发肯定会有一堆设置选项选项,每次进入Activity都去手动的去取储存的数据,这样代码会变得很复杂很麻烦。 这个时候Preference就出来了,它就是专门解决这些特殊的选项保存与读取的显示。用户每次操作事件它会及时的以键值对的形式记录在 SharedPreferences中,Activity每次启动它会自动帮我们完成数据的读取以及UI的显示。
android开发中一共为我们提供了4个组件,分别是CheckBoxPreference组件、EditTextPreference组件、 ListPreference组件、RingtonePreference组件,下面我用一个例子一一向同学们介绍一下。
2.CheckBoxPreference组件
CheckBoxPreference 选中为true 取消选中为false 它的值会以boolean的形式储存在SharedPreferences中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
PreferenceScreen
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
PreferenceCategory
android:title
=
"CheckBoxPreference"
>
<
CheckBoxPreference
android:key
=
"checkbox_0"
android:title
=
"CheckBox_A"
android:summary
=
"这是一个勾选框A"
>
</
CheckBoxPreference
>
<
CheckBoxPreference
android:key
=
"checkbox_1"
android:title
=
"CheckBox_B"
android:summary
=
"这是一个勾选框B"
>
</
CheckBoxPreference
>
</
PreferenceCategory
>
</
PreferenceScreen
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import
android.content.Context;
import
android.os.Bundle;
import
android.preference.CheckBoxPreference;
import
android.preference.Preference;
import
android.preference.PreferenceActivity;
import
android.preference.Preference.OnPreferenceChangeListener;
import
android.preference.Preference.OnPreferenceClickListener;
import
android.widget.Toast;
public
class
CheckBoxActivity
extends
PreferenceActivity {
Context mContext =
null
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.checkbox);
mContext =
this
;
//CheckBoxPreference组件
CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference(
"checkbox_0"
);
mCheckbox0.setOnPreferenceClickListener(
new
OnPreferenceClickListener() {
@Override
public
boolean
onPreferenceClick(Preference preference) {
//这里可以监听到这个CheckBox 的点击事件
return
true
;
}
});
mCheckbox0.setOnPreferenceChangeListener(
new
OnPreferenceChangeListener() {
@Override
public
boolean
onPreferenceChange(Preference arg0, Object newValue) {
//这里可以监听到checkBox中值是否改变了
//并且可以拿到新改变的值
Toast.makeText(mContext,
"checkBox_0改变的值为"
+ (Boolean)newValue, Toast.LENGTH_LONG).show();
return
true
;
}
});
CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference(
"checkbox_1"
);
mCheckbox1.setOnPreferenceClickListener(
new
OnPreferenceClickListener() {
@Override
public
boolean
onPreferenceClick(Preference preference) {
//这里可以监听到这个CheckBox 的点击事件
return
true
;
}
});
mCheckbox1.setOnPreferenceChangeListener(
new
OnPreferenceChangeListener() {
@Override
public
boolean
onPreferenceChange(Preference arg0, Object newValue) {
//这里可以监听到checkBox中值是否改变了
//并且可以拿到新改变的值
Toast.makeText(mContext,
"checkBox_1改变的值为"
+ (Boolean)newValue, Toast.LENGTH_LONG).show();
return
true
;
}
});
}
}
|
3.EditTextPreference组件
EditTextPreference 点击后会弹出一个输入框,输入的内容会以字符串的的形式储存在SharedPreferences中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
PreferenceScreen
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
PreferenceCategory
android:title
=
"EditTextPreference"
>
<
EditTextPreference
android:key
=
"edit_0"
android:title
=
"输入信息_A"
android:summary
=
"请输入您的信息"
android:defaultValue
=
"请输入信息"
android:dialogTitle
=
"输入框"
>
</
EditTextPreference
>
<
EditTextPreference
android:key
=
"edit_1"
android:title
=
"输入信息_B"
android:summary
=
"请输入您的信息"
android:defaultValue
=
"请输入信息"
android:dialogTitle
=
"输入框"
>
</
EditTextPreference
>
</
PreferenceCategory
>
</
PreferenceScreen
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import
android.content.Context;
import
android.os.Bundle;
import
android.preference.EditTextPreference;
import
android.preference.PreferenceActivity;
public
class
EditTextActivity
extends
PreferenceActivity {
Context mContext =
null
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.edittext);
mContext =
this
;
// EditTextPreference组件
EditTextPreference mEditText = (EditTextPreference) findPreference(
"edit_0"
);
//设置dialog按钮信息
mEditText.setPositiveButtonText(
"确定"
);
mEditText.setNegativeButtonText(
"取消"
);
//设置按钮图标
mEditText.setDialogIcon(R.drawable.jay);
}
}
|
4.ListPreference组件
在res/array中先写两个数组,一个用与list的显示内容,一个用户list的选中数值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
resources
>
<
string-array
name
=
"auto_logout_time_key"
>
<
item
>10 mins.</
item
>
<
item
>20 mins.</
item
>
<
item
>30 mins.</
item
>
<
item
>60 mins.</
item
>
</
string-array
>
<
string-array
name
=
"auto_logout_time_value"
>
<
item
>600000</
item
>
<
item
>1200000</
item
>
<
item
>1800000</
item
>
<
item
>3600000</
item
>
</
string-array
>
</
resources
>
|
ListPreference点击后会弹出一个列表框,选中后会将选中的内容(上面数组中的值)会以字符串的的形式储存在SharedPreferences中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
PreferenceScreen
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
PreferenceCategory
android:title
=
"ListPreference"
>
<
ListPreference
android:key
=
"list_0"
android:title
=
"登录设置A"
android:dialogTitle
=
"选择在线时间"
android:entries
=
"@array/auto_logout_time_key"
android:entryValues
=
"@array/auto_logout_time_value"
>
</
ListPreference
>
<
ListPreference
android:key
=
"list_0"
android:title
=
"登录设置A"
android:dialogTitle
=
"选择在线时间"
android:entries
=
"@array/auto_logout_time_key"
android:entryValues
=
"@array/auto_logout_time_value"
>
</
ListPreference
>
</
PreferenceCategory
>
</
PreferenceScreen
>
|
1
2
3
4
5
6
7
8
9
10
11
|
import
android.os.Bundle;
import
android.preference.PreferenceActivity;
public
class
ListActivity
extends
PreferenceActivity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.list);
}
}
|
5.RingtonePreference组件
RingtonePreference点击后会弹出一个系统铃声的列表框,选中后会将选中的内容(uri字符集)会以字符串的的形式储存在SharedPreferences中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
PreferenceScreen
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
PreferenceCategory
android:title
=
"RingtonePreference"
>
<
RingtonePreference
android:key
=
"ringtone_0"
android:summary
=
"选择系统铃声A"
android:title
=
"铃声设置"
android:ringtoneType
=
"all"
android:showSilent
=
"true"
></
RingtonePreference
>
<
RingtonePreference
android:key
=
"ringtone_!"
android:summary
=
"选择系统铃声B"
android:title
=
"铃声设置"
android:ringtoneType
=
"all"
android:showSilent
=
"true"
></
RingtonePreference
>
</
PreferenceCategory
>
</
PreferenceScreen
>
|
android:ringtoneType 系统一共提供了4中响铃模式的类型分别为 铃声(ringtone) 通知( notification) 警告(alarm) 全部(all)
模拟器默认是没有铃声的,下图中的铃声我是将歌曲文件拷贝到SD卡中,设置铃声后才会出现的。如果觉得拷贝麻烦可以使用豌豆荚或者91助手将歌曲文件放入手机SD卡中,在铃声设置那里设置一下在这里就会出现。
1
2
3
4
5
6
7
8
9
10
11
|
import
android.os.Bundle;
import
android.preference.PreferenceActivity;
public
class
RingtoneActivity
extends
PreferenceActivity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.ringtone);
}
}
|
5.自定义控件
使用系统的控件在显示方面难免会有些单一,如果想做一个好看的界面就需要使用自定义Preference。下面我简单说明一下如何编写自定义Preference。首先在res/layout中添加preferences文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:background
=
"#00000000"
>
<
LinearLayout
android:gravity
=
"center_vertical"
android:background
=
"@drawable/preference_mid_background"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
>
<
ImageView
android:focusable
=
"false"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:src
=
"@drawable/setting_about_us"
>
</
ImageView
>
<
RelativeLayout
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_marginLeft
=
"15dip"
android:layout_marginTop
=
"6dip"
android:layout_marginRight
=
"6dip"
android:layout_marginBottom
=
"6dip"
android:layout_weight
=
"1"
>
<
TextView
android:textSize
=
"15dip"
android:textColor
=
"#000000"
android:ellipsize
=
"marquee"
android:id
=
"@+android:id/title"
android:fadingEdge
=
"horizontal"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:singleLine
=
"true"
>
</
TextView
>
<
TextView
android:textAppearance
=
"?android:attr/textAppearanceSmall"
android:textColor
=
"#565656"
android:id
=
"@+android:id/summary"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:maxLines
=
"4"
android:layout_below
=
"@+android:id/title"
android:layout_alignLeft
=
"@+android:id/title"
>
</
TextView
>
</
RelativeLayout
>
<
ImageView
android:focusable
=
"false"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:background
=
"@drawable/preference_arrows"
/>
</
LinearLayout
>
</
LinearLayout
>
|
android:background=”@drawable/preference_mid_background”
通过这一行可以设置这个按钮的点击、选中默认的显示状态,这样可以让你的按钮更加好看。须要在res/drawable中添加xml文件
android:state_facused :为控件选中显示
android:state_pressed:为控件按下显示
最后一个为默认显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
selector
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
item
android:state_focused
=
"true"
android:drawable
=
"@drawable/preference_mid_pressed"
>
</
item
>
<
item
android:state_pressed
=
"true"
android:drawable
=
"@drawable/preference_mid_pressed"
>
</
item
>
<
item
android:drawable
=
"@drawable/preference_mid"
>
</
item
>
</
selector
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import
android.content.Context;
import
android.os.Bundle;
import
android.preference.Preference;
import
android.preference.PreferenceActivity;
import
android.preference.Preference.OnPreferenceClickListener;
import
android.widget.Toast;
public
class
AllActivity
extends
PreferenceActivity {
/**自定义布局A**/
Preference preference0 =
null
;
/**自定义布局B**/
Preference preference1 =
null
;
Context mContext =
null
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.all);
mContext =
this
;
preference0 = findPreference(
"pref_key_0"
);
preference0.setOnPreferenceClickListener(
new
OnPreferenceClickListener() {
@Override
public
boolean
onPreferenceClick(Preference preference) {
Toast.makeText(mContext,
"自定义布局A被按下"
, Toast.LENGTH_LONG).show();
return
false
;
}
});
preference1 = findPreference(
"pref_key_1"
);
preference1.setOnPreferenceClickListener(
new
OnPreferenceClickListener() {
@Override
public
boolean
onPreferenceClick(Preference preference) {
Toast.makeText(mContext,
"自定义布局B被按下"
, Toast.LENGTH_LONG).show();
return
false
;
}
});
}
}
|
读取数据
在PreferenceActivity中可以用下面这种方式拿到SharedPreferences中储存的数值,通过 PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默认储存的sharedPreferences对象。
1
2
|
SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(
this
) ;
boolean
something = prefs.getBoolean(
"something"
,
false
);
|
在模拟起中将SharedPreferences储存内容拷贝出来后,可以清楚的看到通过点击系统控件储存的数值。这里我说一下铃声的储存,它是以一个字符串形式的uri字符集,它所指向的是系统铃声储存的路径。所以根据这个字符集就可以找到这个铃声。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?
xml
version
=
'1.0'
encoding
=
'utf-8'
standalone
=
'yes'
?>
<
map
>
<
string
name
=
"ringtone_!"
>content://media/external/audio/media/1</
string
>
<
string
name
=
"ringtone_0"
>content://media/external/audio/media/1</
string
>
<
string
name
=
"list_0"
>1800000</
string
>
<
string
name
=
"edit_1"
>请输入信息1212</
string
>
<
string
name
=
"list"
>1200000</
string
>
<
string
name
=
"ringtone"
>content://settings/system/ringtone</
string
>
<
boolean
name
=
"checkbox_0"
value
=
"true"
/>
<
boolean
name
=
"checkbox_1"
value
=
"true"
/>
<
string
name
=
"edit_0"
>请输入信息</
string
>
</
map
>
|
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4991762.html,如需转载请自行联系原作者