玩转Android--UI篇--PreferenceActivity

http://hualang.iteye.com/blog/1163185



本测试主要是为了测试PreferenceActivity的使用,其中设置了播放背景音乐和开启wifi的设置,也就是本文要讲的

PreferenceActivity。

Android提供了放摆放的工具来定义所有的程序的首选项,并支持既不不许要编写代码的情况写显示这些首选项。可以在一个名为res/xml/settings.xml的资源文件中定义这些首选项:

res/xml/settings.xml

Java代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <PreferenceScreen
  3. xmlns:android="http://schemas.android.com/apk/res/android">
  4. <CheckBoxPreference
  5. android:key="music"
  6. android:title="@string/music"
  7. android:summaryOn="@string/music_summaryOn"
  8. android:summaryOff="@string/music_summaryOff"
  9. android:defaultValue="true"
  10. />
  11. <CheckBoxPreference
  12. android:key="wifi"
  13. android:title="@string/wifi"
  14. android:summaryOn="@string/wifi_summaryOn"
  15. android:summaryOff="@string/wifi_summaryOff"
  16. android:defaultValue="true"
  17. />
  18. </PreferenceScreen>

res/values/strings.xml

Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <stringname="hello">HelloWorld,NewGameActivity!</string>
  4. <stringname="btntext">开始游戏</string>
  5. <stringname="app_name">NewGame</string>
  6. <stringname="game_level">游戏级别</string>
  7. <stringname="easy_level">菜鸟级</string>
  8. <stringname="general_level">普通级</string>
  9. <stringname="medium_level">高手级</string>
  10. <stringname="hard_level">骨灰级</string>
  11. <stringname="wifiinfo">启动wifi</string>
  12. <stringname="music">音乐</string>
  13. <stringname="music_summaryOn">开启背景音乐</string>
  14. <stringname="music_summaryOff">关闭背景音乐</string>
  15. <stringname="wifi">无线</string>
  16. <stringname="wifi_summaryOn">开启无线网络</string>
  17. <stringname="wifi_summaryOff">关闭无线网络</string>
  18. </resources>

Settings.java

Java代码 收藏代码
  1. packagecom.hualang.gotogame;
  2. importandroid.content.Context;
  3. importandroid.os.Bundle;
  4. importandroid.preference.PreferenceActivity;
  5. importandroid.preference.PreferenceManager;
  6. publicclassSettingsextendsPreferenceActivity{
  7. privatestaticfinalStringMUSIC="music";
  8. privatestaticfinalbooleanMUSIC_DEF=true;
  9. privatestaticfinalStringWIFI="wifi";
  10. privatestaticfinalbooleanWIFI_DEF=true;
  11. @Override
  12. publicvoidonCreate(BundlesavedInstanceState){
  13. super.onCreate(savedInstanceState);
  14. addPreferencesFromResource(R.xml.settings);
  15. }
  16. //获得当前音乐的值
  17. publicstaticbooleangetMusic(Contextcontext)
  18. {
  19. returnPreferenceManager.getDefaultSharedPreferences(context).getBoolean(MUSIC,MUSIC_DEF);
  20. }
  21. //获取当前蓝牙选项的值
  22. publicstaticbooleangetWifi(Contextcontext)
  23. {
  24. returnPreferenceManager.getDefaultSharedPreferences(context).getBoolean(WIFI,WIFI_DEF);
  25. }
  26. }

addPreferencesFromResource()方法从XML中读取设置定义,并将其解压缩到当前的活动试图中,所有耗时的解压缩工作都是在PreferenceActivity类中处理的

保存的Preference文件存放在data/data/项目包名/shared_prefs下,名字为“包名_preferences.xml”

这里的就是:

com.hualang.gotogame_preferences.xml
Music.java用于设置背景音乐

Java代码 收藏代码
  1. packagecom.hualang.gotogame;
  2. importandroid.content.Context;
  3. importandroid.media.MediaPlayer;
  4. publicclassMusic{
  5. privatestaticMediaPlayermp=null;
  6. //停止旧歌曲,开始新歌曲
  7. publicstaticvoidplay(Contextcontext,intresource)
  8. {
  9. stop(context);
  10. if(Settings.getMusic(context))
  11. {
  12. mp=MediaPlayer.create(context,resource);
  13. mp.setLooping(true);
  14. mp.start();
  15. }
  16. }
  17. //停止音乐
  18. publicstaticvoidstop(Contextcontext)
  19. {
  20. if(mp!=null)
  21. {
  22. mp.stop();
  23. mp.release();
  24. mp=null;
  25. }
  26. }
  27. }

下面就是核心代码了,这里主要说一下如何调用背景音乐和蓝牙

背景音乐:

首先,开发者必须了解Android的生命周期,当我们运行的时候,会经历onCreate---onStart---onResume,我们可以将设置背景音乐和蓝牙的设置放在此处,代码如下:

Java代码 收藏代码
  1. @Override
  2. protectedvoidonResume(){
  3. //TODOAuto-generatedmethodstub
  4. super.onResume();
  5. Music.play(this,R.raw.test);
  6. if(Settings.getWifi(this))
  7. {
  8. wifion();
  9. }else
  10. {
  11. wifioff();
  12. }
  13. Log.d("System.out","onResume-----------");
  14. }

这样,如果保存的CheckBoxPreferences为true,就设置背景音乐,启动wifi,否则就关闭北京音乐,关闭wifi

当我们进入设置界面的时候,进入了onPause,设置完后返回主界面,又变成了onResume,所以背景音乐部分在进入

onPause时停止掉,只有到进入主界面玩游戏的时候再开启,这样要合理些。代码如下:

Java代码 收藏代码
  1. @Override
  2. protectedvoidonPause(){
  3. //TODOAuto-generatedmethodstub
  4. super.onPause();
  5. Music.stop(this);
  6. Log.d("System.out","onPause----------------");
  7. }

Wifi:

首先需要在清单文件中加入权限:

Xml代码 收藏代码
  1. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
  2. <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
  3. <uses-permissionandroid:name="android.permission.WAKE_LOCK"/>

我们也将wifi的操作放在onResume中

Java代码 收藏代码
  1. publicvoidwifion()
  2. {
  3. if(!wifiManager.isWifiEnabled())
  4. wifiManager.setWifiEnabled(true);
  5. }
  6. publicvoidwifioff()
  7. {
  8. if(wifiManager.isWifiEnabled())
  9. wifiManager.setWifiEnabled(false);
  10. }

上面两个方法用户打开和关闭wifi。

下面的代码通过判断Setting.getWifi(this)的布尔值,如果真,也就是被选中的话,则打卡wifi,否则关闭wifi

Java代码 收藏代码
  1. @Override
  2. protectedvoidonResume(){
  3. //TODOAuto-generatedmethodstub
  4. super.onResume();
  5. Music.play(this,R.raw.test);
  6. if(Settings.getWifi(this))
  7. {
  8. wifion();
  9. }else
  10. {
  11. wifioff();
  12. }
  13. Log.d("System.out","onResume-----------");
  14. }

NewGameActivity

Java代码 收藏代码
  1. packagecom.hualang.gotogame;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.content.Context;
  5. importandroid.content.DialogInterface;
  6. importandroid.content.Intent;
  7. importandroid.content.SharedPreferences;
  8. importandroid.net.wifi.WifiManager;
  9. importandroid.os.Bundle;
  10. importandroid.util.Log;
  11. importandroid.view.Menu;
  12. importandroid.view.MenuItem;
  13. importandroid.view.View;
  14. importandroid.view.View.OnClickListener;
  15. importandroid.widget.Button;
  16. publicclassNewGameActivityextendsActivity{
  17. privateButtonclickme;
  18. WifiManagerwifiManager;
  19. @Override
  20. publicvoidonCreate(BundlesavedInstanceState){
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.main);
  23. wifiManager=(WifiManager)this.getSystemService(Context.WIFI_SERVICE);
  24. clickme=(Button)findViewById(R.id.clickme);
  25. clickme.setOnClickListener(newOnClickListener()
  26. {
  27. @Override
  28. publicvoidonClick(Viewv){
  29. startNewGameDialog();
  30. }
  31. });
  32. }
  33. privatevoidstartNewGameDialog()
  34. {
  35. newAlertDialog.Builder(this)
  36. .setTitle(R.string.game_level)
  37. .setItems(R.array.difficulty,
  38. newDialogInterface.OnClickListener(){
  39. @Override
  40. publicvoidonClick(DialogInterfacedialog,intwhich){
  41. startGame(which);
  42. }
  43. }).show();
  44. }
  45. privatevoidstartGame(inti)
  46. {
  47. //开始游戏
  48. }
  49. @Override
  50. publicbooleanonCreateOptionsMenu(Menumenu){
  51. menu.add(0,0,0,"设置");
  52. menu.add(0,1,1,"关于");
  53. menu.add(0,2,2,"退出");
  54. returnsuper.onCreateOptionsMenu(menu);
  55. }
  56. @Override
  57. publicbooleanonOptionsItemSelected(MenuItemitem){
  58. switch(item.getItemId())
  59. {
  60. case0:
  61. {
  62. Intentintent=newIntent();
  63. intent.setClass(NewGameActivity.this,Settings.class);
  64. startActivity(intent);
  65. }
  66. break;
  67. case1:
  68. break;
  69. case2:
  70. finish();
  71. break;
  72. }
  73. returnsuper.onOptionsItemSelected(item);
  74. }
  75. @Override
  76. protectedvoidonResume(){
  77. //TODOAuto-generatedmethodstub
  78. super.onResume();
  79. Music.play(this,R.raw.test);
  80. if(Settings.getWifi(this))
  81. {
  82. wifion();
  83. }else
  84. {
  85. wifioff();
  86. }
  87. Log.d("System.out","onResume-----------");
  88. }
  89. @Override
  90. protectedvoidonPause(){
  91. //TODOAuto-generatedmethodstub
  92. super.onPause();
  93. Music.stop(this);
  94. Log.d("System.out","onPause----------------");
  95. }
  96. publicvoidwifion()
  97. {
  98. if(!wifiManager.isWifiEnabled())
  99. wifiManager.setWifiEnabled(true);
  100. }
  101. publicvoidwifioff()
  102. {
  103. if(wifiManager.isWifiEnabled())
  104. wifiManager.setWifiEnabled(false);
  105. }
  106. }

运行结果如下:








源代码见附件:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值