Android之设置页面(PreferenceActivity使用)
Posted dsliang12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之设置页面(PreferenceActivity使用)相关的知识,希望对你有一定的参考价值。
转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/50557811;
本文出自:【梁大盛的博客】
android之设置页面(PreferenceActivity使用)
引:没仔细看Setting之前也接触过PreferenceActivity.之前还是停留在PreferenceActivity仅仅封装了SharedPreferences的层面上.事实上PreferenceActivity早在API 1就引入并且很多时候用来设计设置页面.原生Android Setting程序就是这样干的.使用PreferenceActivity作为设置页面可以省略界面的设计,用各种Preference的子类实现界面,如CheckBoxPreference, EditTextPreference, ListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference等.编辑一个xml文件即可以完成界面的设计.然后提供形形色色的回调接口.当设置给修改以后会自动保存相应的SharedPreferences并且回调已经设置的回调函数.
首先贴出Demo效果图和代码.
MainActivity.java
package com.example.dsliang.preferenceactivitydemo;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(android.R.id.content, new PreferenceFagment());
fragmentTransaction.commit();
package com.example.dsliang.preferenceactivitydemo;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.widget.Toast;
/**
* Created by dsliang on 2016/1/21.
*/
public class PreferenceFagment extends PreferenceFragment
SharedPreferences.OnSharedPreferenceChangeListener mChangeListener;
Activity mActivity;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mActivity = getActivity();
mChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener()
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
if ("setting_wifi".equals(key) || "setting_bluetouh".equals(key) || "charge_lock_screen".equals(key) || "never_sleep".equals(key))
Toast.makeText(mActivity, key + " : change to " + sharedPreferences.getBoolean(key, true), Toast.LENGTH_SHORT).show();
else if("setting_timezone".equals(key))
findPreference("setting_timezone").setSummary(sharedPreferences.getString(key,"GMY - 02:00"));
;
addPreferencesFromResource(R.xml.preferences);
@Override
public void onResume()
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(mChangeListener);
@Override
public void onPause()
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(mChangeListener);
PreferenceFagment.java
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!--android:defaultValue 设置默认值-->
<!--android:key 在Preference里面存储的key,在代码中通过此key索引Preference对象-->
<!--android:title 标题-->
<!--android:summary 描述,对选项进一步补充描述 -->
<!--PreferenceCategory一组分类-->
<PreferenceCategory android:title="@string/category_network">
<!--选择控件-->
<SwitchPreference
android:defaultValue="false"
android:key="setting_wifi"
android:title="Wi-Fi" />
<SwitchPreference
android:defaultValue="false"
android:key="setting_bluetouh"
android:title="蓝牙" />
<!--PreferenceScreen代表一页选项,当点击进去的时候会跳转到另一个页面,点击返回按钮会回到上一个页面-->
<PreferenceScreen
android:key="setting_traffic_usage"
android:title="流量使用情况" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/category_device">
<PreferenceScreen
android:key="setting_sound"
android:title="声音" />
<PreferenceScreen
android:key="setting_display"
android:title="显示" />
<PreferenceScreen
android:key="setting_storage"
android:title="存储" />
<PreferenceScreen
android:key="setting_battery"
android:title="电池" />
<PreferenceScreen
android:key="setting_application"
android:title="应用" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/category_system">
<PreferenceScreen
android:key="setting_date_time"
android:title="日期和时间">
<CheckBoxPreference
android:key="auto_set_date_time"
android:summary="使用网络上的时间"
android:title="自动确定日期和时间" />
<CheckBoxPreference
android:key="auto_set_timezone"
android:summary="使用网络上的时区"
android:title="自动确定时区" />
<Preference
android:dependency="auto_set_date_time"
android:summary="2016-1-21"
android:title="设置日期" />
<Preference
android:dependency="auto_set_date_time"
android:summary="上午 10:43"
android:title="设置时间" />
<ListPreference
android:dependency="auto_set_timezone"
android:entries="@array/time_zone"
android:entryValues="@array/time_zone"
android:key="setting_timezone"
android:title="现在时区" />
</PreferenceScreen>
<PreferenceScreen
android:key="setting_auxiliary_function"
android:title="辅助功能" />
<PreferenceScreen
android:key="setting_developer_options"
android:title="开发者选项">
<Preference
android:summary="桌面备份密码"
android:title="桌面完成备份当前未设置密码保护" />
<CheckBoxPreference
android:defaultValue="false"
android:key="charge_lock_screen"
android:summary="充电时屏幕不会休眠"
android:title="不锁定屏幕" />
<CheckBoxPreference
android:defaultValue="true"
android:key="never_sleep"
android:summary="Screen will never sleep"
android:title="Always stay awake" />
</PreferenceScreen>
<PreferenceScreen
android:key="setting_about_phone"
android:title="关于手机">
<Preference
android:summary="电话号码、信号等"
android:title="状态信息" />
<Preference android:title="法律信息" />
<Preference
android:summary="Samsung Galaxy S2 - 4.1.1 - API 16 - 480*800"
android:title="信号" />
<Preference
android:summary="4.1.1"
android:title="Android版本" />
<Preference
android:summary="未知"
android:title="基带版本" />
</PreferenceScreen>
</PreferenceCategory>
<Preference android:title="关于">
<intent
android:action="android.intent.action.VIEW"
android:data="http://blog.csdn.net/zq2114522" />
</Preference>
</PreferenceScreen>
strings.xml
<resources>
<string name="app_name">PreferenceActivityDemo</string>
<string name="category_network">无线和网络</string>
<string name="category_device">设备</string>
<string name="category_system">系统</string>
<array name="time_zone">
<item>GMT - 00:00</item>
<item>GMT - 01:00</item>
<item>GMT - 02:00</item>
<item>GMT - 03:00</item>
<item>GMT - 04:00</item>
<item>GMT - 05:00</item>
<item>GMT - 06:00</item>
<item>GMT - 07:00</item>
<item>GMT - 08:00</item>
<item>GMT - 09:00</item>
<item>GMT - 10:00</item>
<item>GMT - 11:00</item>
<item>GMT - 12:00</item>
<item>GMT - 13:00</item>
<item>GMT - 14:00</item>
<item>GMT - 15:00</item>
<item>GMT - 16:00</item>
<item>GMT - 17:00</item>
<item>GMT - 18:00</item>
<item>GMT - 19:00</item>
<item>GMT - 20:00</item>
<item>GMT - 21:00</item>
<item>GMT - 22:00</item>
<item>GMT - 23:00</item>
</array>
</resources>
PreferenceActivity的使用,针对3.0系统之前和之后.在3.0之前可以使用PreferenceActivity实现Setting页面.在3.0以后就推荐使用PreferenceFragment实现Setting页面.用Fragment可以很灵活其次可以很容易实现大屏幕的适配.
PreferenceFragment使用
1.继承PreferenceFragment
2.public void onCreate(Bundle savedInstanceState)函数调用addPreferencesFromResource(R.xml.preferences)加载xml布局文件
3.public void onResume()
函数设置registerOnSharedPreferenceChangeListener回调函数
4.public void onPause()
函数取消unregisterOnSharedPreferenceChangeListener回调函数- PreferenceFragment使用比较简单,主要写xml布局文件的编写.
xml布局文件:
1.PreferenceScreen作为根节点
2.子节点包含各种Preference的子类,关键属性,title-标题,summary-摘要,key-在SharedPreferences中使用的索引(id)
3.Preference节点,可以包含intent.当点击该Preference的时候会发送所设置的intent
4.PreferenceScreen根节点可以在包含PreferenceScreen节点.PreferenceScreen代表子页.当点击的时候进入全新的一页.- PreferenceFragment使用比较简单,主要写xml布局文件的编写.
如何获取SharedPreferences数据?
在程序任何地方通过调一下函数可以获取到SharedPreferences
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String syncConnPref = sharedPref.getString(SettingsActivity.KEY_PREF_SYNC_CONN, "");
参考
1.PreferenceActivity http://android.xsoftlab.net/reference/android/preference/PreferenceActivity.html
2.Preference http://android.xsoftlab.net/reference/android/preference/Preference.html
以上是关于Android之设置页面(PreferenceActivity使用)的主要内容,如果未能解决你的问题,请参考以下文章