Android的设置界面及Preference使用

一般来说,我们的APP都会有自己的设置页面,那么其实我们有非常简单的制作方法。老样子,先看效果图。


然后就是看源代码了。

 第一步,先在res文件夹中新建一个xml文件夹,用来存放preferences.xml文件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="显示一排偏好">
        <CheckBoxPreference
            android:key="checkbox_preference"
            android:summary="这是一个开关按钮"
            android:title="开关偏好" />
    </PreferenceCategory>
    <PreferenceCategory android:title="基于对话框的偏好">
        <EditTextPreference
            android:dialogTitle="输入你的宠物"
            android:key="edittext_preference"
            android:summary="使用一个文本框对话框"
            android:title="文本输入偏好" />
        <ListPreference
            android:dialogTitle="选择一个"
            android:entries="@array/entries_list_preference"
            android:entryValues="@array/entryvalues_list_preference"
            android:key="list_preference"
            android:summary="使用一个列表对话框"
            android:title="列表偏好" />
    </PreferenceCategory>
    <PreferenceCategory android:title="启动偏好">
        <PreferenceScreen
            android:key="screen_preference"
            android:summary="显示另一个偏好屏幕"
            android:title="屏幕">

            <CheckBoxPreference
                android:key="next_screen_checkbox_preference"
                android:summary="另一个屏幕上的偏好"
                android:title="开关偏好" />
        </PreferenceScreen>

        <PreferenceScreen
            android:summary="通过意图启动一个Activity"
            android:title="意图偏好">
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </PreferenceScreen>
    </PreferenceCategory>
    <PreferenceCategory android:title="偏好属性">
        <CheckBoxPreference
            android:key="parent_checkbox_preference"
            android:summary="这是一个父开关"
            android:title="父开关" />
        <CheckBoxPreference
            android:dependency="parent_checkbox_preference"
            android:key="child_checkbox_preference"
            android:layout="?android:attr/preferenceLayoutChild"
            android:summary="这是一个子开关"
            android:title="子开关" />
    </PreferenceCategory>
</PreferenceScreen>

 第二步,在string.xml文件中添加项数组

<resources>
    <string name="app_name">My Application</string>
        <string-array name="entries_list_preference">
            <item>IT</item>
            <item>Commerce</item>
            <item>HR</item>
        </string-array>
        <string-array name="entryvalues_list_preference">
            <item>001</item>
            <item>002</item>
            <item>003</item>
        </string-array>
    </resources>

 第三步,让Activity继承PreferenceActivity(其实这种方式目前会提示过期,但是没关系),然后在重写onCreate方法,添加preferences.xml作为显示界面。

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//      setContentView(R.layout.activity_setting);
        addPreferencesFromResource(R.xml.preferences);
    }

做到这一步,其实已经可以运行并看到效果了。但那么我们要如何拿到这些数据呢?那么修改下 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        boolean ON_OFF = sp.getBoolean("checkbox_preference", false);
        boolean next_screen = sp.getBoolean("next_screen_checkbox_preference", false);
        String text = sp.getString("edittext_preference", "");
        String listtext = sp.getString("list_preference", "");
        Log.i("lenve", ON_OFF+"--"+next_screen+"--"+text+"--"+listtext);
    }

可是有的时候我们如果希望更改后立马被系统获知选项已被更改,又该如何?复写继承了PreferenceActivity的类中的onPreferenceTreeClick方法,这个方法会在设置修改时触发。

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        SharedPreferences sp = preference.getSharedPreferences();
        boolean ON_OFF = sp.getBoolean("checkbox_preference", false);
        Log.i("lenve", ON_OFF+"");
        String text = sp.getString("edittext_preference", "");
        Log.i("lenve", text+"");
        String listtext = sp.getString("list_preference", "");
        Log.i("lenve", listtext+"");
        boolean next_screen = sp.getBoolean("next_screen_checkbox_preference", false);
        Log.i("lenve", next_screen+"");
        return true;
    }

好了,啰嗦到现在,我们直接看整个MainActivity的代码吧

package com.example.linfeng.myapplication;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.util.Log;

public class MainActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        boolean ON_OFF = sp.getBoolean("checkbox_preference", false);
        boolean next_screen = sp.getBoolean("next_screen_checkbox_preference", false);
        String text = sp.getString("edittext_preference", "");
        String listtext = sp.getString("list_preference", "");
        Log.i("lenve", ON_OFF+"--"+next_screen+"--"+text+"--"+listtext);
    }


    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        SharedPreferences sp = preference.getSharedPreferences();
        boolean ON_OFF = sp.getBoolean("checkbox_preference", false);
        Log.i("lenve", ON_OFF+"");
        String text = sp.getString("edittext_preference", "");
        Log.i("lenve", text+"");
        String listtext = sp.getString("list_preference", "");
        Log.i("lenve", listtext+"");
        boolean next_screen = sp.getBoolean("next_screen_checkbox_preference", false);
        Log.i("lenve", next_screen+"");
        return true;
    }
}

就这么简单。OK啦

原文地址:https://www.cnblogs.com/linfenghp/p/9375293.html