您的位置:首页 > Web前端

PreferenceActivity的使用

2014-04-19 18:47 435 查看
PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存。Android专门为这种Activity提供了便捷的基类PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。

PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。

选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。

从3.0以后Android不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议将PreferenceActivity与PreferenceFragment结合使用。

先新建一个工程:



Activity继承自PreferenceActivity

viewsourceprint?

01.
package
com.example.testpreferenceactivity;

02.

03.
import
android.os.Bundle;

04.
import
android.preference.PreferenceActivity;

05.

06.
public
class
MainActivity
extends
PreferenceActivity{

07.

08.
@Override

09.
protected
void
onCreate(BundlesavedInstanceState){

10.
super
.onCreate(savedInstanceState);

11.
//setContentView(R.layout.activity_main);

12.
addPreferencesFromResource(R.xml.preference);

13.
}

14.
}


在res目录下新建立一个xml目录,在该目录中建立preference.xml

viewsourceprint?

01.
<?xmlversion=
"1.0"
encoding=
"UTF-8"
?>

02.
<PreferenceScreen

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

04.
android:title=
"Settings"
>

05.
<CheckBoxPreference

06.
android:title=
"Loveme?"

07.
android:summaryOn=
"Yes,Iloveyou!"

08.
android:summaryOff=
"No,Iamsorry."

09.
android:defaultValue=
"true"
>

10.
</CheckBoxPreference>

11.
</PreferenceScreen>




可以将上面的preference.xml中代码修改如下,就可实现嵌套设置菜单

viewsourceprint?

01.
<?xmlversion=
"1.0"
encoding=
"UTF-8"
?>

02.
<PreferenceScreen

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

04.
android:title=
"Settings"
>

05.
<PreferenceScreen

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

07.
android:title=
"Emotions"

08.
android:summary=
"settingsaboutemotions"
>

09.
<CheckBoxPreference

10.
android:title=
"Loveme?"

11.
android:summaryOn=
"Yes,Iloveyou!"

12.
android:summaryOff=
"No,Iamsorry."

13.
android:defaultValue=
"true"
>

14.
</CheckBoxPreference>

15.
<CheckBoxPreference

16.
android:title=
"Hateme?"

17.
android:summaryOn=
"Yes,Ihateyou!"

18.
android:summaryOff=
"No,youareagoodperson."

19.
android:defaultValue=
"false"
>

20.
</CheckBoxPreference>

21.
</PreferenceScreen>

22.
<PreferenceScreen

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

24.
android:title=
"Relations"

25.
android:summary=
"settingsaboutrelations"
>

26.
<CheckBoxPreference

27.
android:title=
"Family?"

28.
android:summaryOn=
"Yes,wearefamily!"

29.
android:summaryOff=
"No,Iamsorry."

30.
android:defaultValue=
"true"
>

31.
</CheckBoxPreference>

32.
<CheckBoxPreference

33.
android:title=
"Friends?"

34.
android:summaryOn=
"Yes,wearefriends!"

35.
android:summaryOff=
"No,Iamsorry."

36.
android:defaultValue=
"false"
>

37.
</CheckBoxPreference>

38.
</PreferenceScreen>

39.
</PreferenceScreen>


将上面xml文件中间那两个PreferenceScreen改为PreferenceCategory就可以看到PreferenceCategory的显示效果了



Android系统提供的还有以对话框显示的DialogPreference,可以输入文本的EditTextPreference,以列表方式显示供选择的ListPreference和设置铃声用的RingtonePreference。详细请看:http://blog.csdn.net/ichliebephone/article/details/5916320

在上面我们提到Android不再推荐直接让PreferenceActivity加载选项设置布局文件,下面我们来看看PreferenceActivity与PreferenceFragment结合使用。

PreferenceActivity加载的选项设置列表布局文件如下:

viewsourceprint?

01.
<?xmlversion=
"1.0"
encoding=
"utf-8"
?>

02.
<preference-headers

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

04.
<!--指定启动指定PreferenceFragment的列表项-->

05.
<headerandroid:fragment=

06.
"org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"

07.
android:icon=
"@drawable/ic_settings_applications"

08.
android:title=
"程序选项设置"

09.
android:summary=
"设置应用的相关选项"
/>

10.
<!--指定启动指定PreferenceFragment的列表项-->

11.
<headerandroid:fragment=

12.
"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"

13.
android:icon=
"@drawable/ic_settings_display"

14.
android:title=
"界面选项设置"

15.
android:summary=
"设置显示界面的相关选项"
>

16.
<!--使用extra可向Activity传入额外的数据-->

17.
<extraandroid:name=
"website"

18.
android:value=
"www.crazyit.org"
/>

19.
</header>

20.
<!--使用Intent启动指定Activity的列表项-->

21.
<header

22.
android:icon=
"@drawable/ic_settings_display"

23.
android:title=
"使用Intent"

24.
android:summary=
"使用Intent启动某个Activity"
>

25.
<intentandroid:action=
"android.intent.action.VIEW"

26.
android:data=
"http://www.crazyit.org"
/>

27.
</header>

28.
</preference-headers>


上面代码中Prefs1Fragment、Prefs2Fragment是两个内部类

在PreferenceActivity中重写onBuidHeaders方法来加载上面的页面布局

viewsourceprint?

1.
public
void
onBuildHeaders(List<Header>target)

2.
{

3.
//加载选项设置列表的布局文件

4.
loadHeadersFromResource(R.xml.preference_headers,target);

5.
}


PreferenceActivity内部还有两个内部类,代码如下:

viewsourceprint?

01.
/**

02.
*

03.
*/

04.
package
org.crazyit.app;

05.

06.
import
java.util.List;

07.

08.
import
android.os.Bundle;

09.
import
android.preference.PreferenceActivity;

10.
import
android.preference.PreferenceFragment;

11.
import
android.widget.Button;

12.
import
android.widget.Toast;

13.

14.

15.
public
class
PreferenceActivityTest
extends
PreferenceActivity

16.
{

17.
@Override

18.
protected
void
onCreate(BundlesavedInstanceState)

19.
{

20.
super
.onCreate(savedInstanceState);

21.
//该方法用于为该界面设置一个标题按钮

22.
if
(hasHeaders())

23.
{

24.
Buttonbutton=
new
Button(
this
);

25.
button.setText(
"设置操作"
);

26.
//将该按钮添加到该界面上

27.
setListFooter(button);

28.
}

29.
}

30.
//重写该该方法,负责加载页面布局文件

31.
@Override

32.
public
void
onBuildHeaders(List<Header>target)

33.
{

34.
//加载选项设置列表的布局文件

35.
loadHeadersFromResource(R.xml.preference_headers,target);

36.
}

37.

38.
public
static
class
Prefs1Fragment
extends
PreferenceFragment

39.
{

40.
@Override

41.
public
void
onCreate(BundlesavedInstanceState)

42.
{

43.
super
.onCreate(savedInstanceState);

44.
addPreferencesFromResource(R.xml.preferences);

45.
}

46.
}

47.
public
static
class
Prefs2Fragment
extends
PreferenceFragment

48.
{

49.
@Override

50.
public
void
onCreate(BundlesavedInstanceState)

51.
{

52.
super
.onCreate(savedInstanceState);

53.
addPreferencesFromResource(R.xml.display_prefs);

54.
//获取传入该Fragment的参数

55.
Stringwebsite=getArguments().getString(
"website"
);

56.
Toast.makeText(getActivity()

57.
,
"网站域名是:"
+website,Toast.LENGTH_LONG).show();

58.
}

59.
}

60.
}


在两个Fragment中我们使用addPreferencesFromResource方法来加载设置的布局文件

preference.xml

viewsourceprint?

01.
<?xmlversion=
"1.0"
encoding=
"utf-8"
?>

02.
<PreferenceScreen

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

04.
<!--设置系统铃声-->

05.
<RingtonePreference

06.
android:ringtoneType=
"all"

07.
android:title=
"设置铃声"

08.
android:summary=
"选择铃声(测试RingtonePreference)"

09.
android:showDefault=
"true"

10.
android:key=
"ring_key"

11.
android:showSilent=
"true"
>

12.
</RingtonePreference>

13.
<PreferenceCategoryandroid:title=
"个人信息设置组"
>

14.
<!--通过输入框填写用户名-->

15.
<EditTextPreference

16.
android:key=
"name"

17.
android:title=
"填写用户名"

18.
android:summary=
"填写您的用户名(测试EditTextPreference)"

19.
android:dialogTitle=
"您所使用的用户名为:"
/>

20.
<!--通过列表框选择性别-->

21.
<ListPreference

22.
android:key=
"gender"

23.
android:title=
"性别"

24.
android:summary=
"选择您的性别(测试ListPreference)"

25.
android:dialogTitle=
"ListPreference"

26.
android:entries=
"@array/gender_name_list"

27.
android:entryValues=
"@array/gender_value_list"
/>

28.
</PreferenceCategory>

29.
<PreferenceCategoryandroid:title=
"系统功能设置组"
>

30.
<CheckBoxPreference

31.
android:key=
"autoSave"

32.
android:title=
"自动保存进度"

33.
android:summaryOn=
"自动保存:开启"

34.
android:summaryOff=
"自动保存:关闭"

35.
android:defaultValue=
"true"
/>

36.
</PreferenceCategory>

37.
</PreferenceScreen>


display_prefs.xml

viewsourceprint?

01.
<?xmlversion=
"1.0"
encoding=
"utf-8"
?>

02.
<PreferenceScreen

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

04.
<PreferenceCategoryandroid:title=
"背景灯光组"
>

05.
<!--通过列表框选择灯光强度-->

06.
<ListPreference

07.
android:key=
"light"

08.
android:title=
"灯光强度"

09.
android:summary=
"请选择灯光强度(测试ListPreference)"

10.
android:dialogTitle=
"请选择灯光强度"

11.
android:entries=
"@array/light_strength_list"

12.
android:entryValues=
"@array/light_value_list"
/>

13.
</PreferenceCategory>

14.
<PreferenceCategoryandroid:title=
"文字显示组"
>

15.
<!--通过SwitchPreference设置是否自动滚屏-->

16.
<SwitchPreference

17.
android:key=
"autoScroll"

18.
android:title=
"自动滚屏"

19.
android:summaryOn=
"自动滚屏:开启"

20.
android:summaryOff=
"自动滚屏:关闭"

21.
android:defaultValue=
"true"
/>

22.
</PreferenceCategory>

23.
</PreferenceScreen>


运行结果:









源代码下载:http://www.it165.net/uploadfile/files/2014/0212/iPhones.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: