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啦

 

posted @   _Vincent  阅读(3828)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示