Android之设置页面(PreferenceActivity使用)

本文介绍了Android中使用PreferenceActivity和PreferenceFragment创建设置页面的方法。通过XML布局文件定义界面,并利用各种Preference子类如CheckBoxPreference, EditTextPreference等。PreferenceActivity简化界面设计,设置变化自动保存于SharedPreferences。同时,文章提供了代码示例,包括MainActivity.java, preferences.xml和如何获取SharedPreferences数据。" 86767164,7317048,Android P: 深入理解Camera HAL3的创建CaptureSession过程,"['Android开发', '摄像头', 'Camera2 API', 'HAL', '图像处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请标明出处:
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代表子页.当点击的时候进入全新的一页.

  • 如何获取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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值