Android设置Settings:ListPreference【3】

Wesley13
• 阅读 1238

Android设置Settings:ListPreference【3】

Android的Settings实现中,ListPreference使用稍微复杂些,ListPreference使用两个数据源:entries和entryValues,entries和entryValues存在对应关系,可以这么简单理解,entries是人类可读的有意义的内容,而entryValues则是用来为机器或代码使用的具体的值,在前面文章【1】和【2】的基础写一个ListPreference的使用加以说明。
res/xml目录下的preferences.xml(有变化):

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

    <PreferenceCategory android:title="【第1组】" >
        <ListPreference
            android:dialogTitle="list dialog title"
            android:entries="@array/citys"
            android:entryValues="@array/citys_code"
            android:key="list_key"
            android:summary="list summary"
            android:title="list title" />
    </PreferenceCategory>
    <PreferenceCategory android:title="【第2组】" >
        <EditTextPreference
            android:defaultValue="缺省值1"
            android:key="edit_text_key_1"
            android:summary="edit summary"
            android:title="edit text 1" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="checkbox_key"
            android:summary="checkbox summary"
            android:title="checkbox title" />
    </PreferenceCategory>

    <!-- 点击将浏览和打开网页 -->
    <Preference
        android:summary="http://blog.csdn.net/zhangphil"
        android:title="浏览网页" >
        <intent
            android:action="android.intent.action.VIEW"
            android:data="http://blog.csdn.net/zhangphil" />
    </Preference>

    <!-- 此处将跳转到下一屏设置 -->
    <PreferenceScreen
        android:key="preference_screen_2_key"
        android:persistent="false"
        android:title="PreferenceScreen 2" >
        <EditTextPreference
            android:defaultValue="缺省值2"
            android:key="edit_text_key_2"
            android:summary="edit summary"
            android:title="edit text 2" />
    </PreferenceScreen>

</PreferenceScreen>

需要的res/values/arrays.xml(注意变化):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="citys">
        <item>成都</item>
        <item>北京</item>
        <item>上海</item>
    </string-array>
    
     <string-array name="citys_code">
        <item>028</item>
        <item>010</item>
        <item>021</item>
    </string-array>
    
</resources>

上层Java代码:

package zhangphil.settings;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;

public class MainActivity extends PreferenceActivity {

    private MyOnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = new MyOnSharedPreferenceChangeListener();

    private EditTextPreference mEditTextPreference;
    private final String A_KEY = "edit_text_key_1";

    private ListPreference mListPreference;
    private final String LIST_KEY = "list_key";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 通用的读取设置的某个值的方法
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        String s = sharedPreferences.getString(A_KEY, "暂时为空");

        // 添加设置的选项
        addPreferencesFromResource(R.xml.preferences);

        // 预读取。为PreferenceActivity中的某个设置选项初始化值
        mEditTextPreference = (EditTextPreference) findPreference(A_KEY);
        mEditTextPreference.setSummary(s);

        // 注册添加设置的项数据发生变化时候的监听
        sharedPreferences.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);

        mListPreference = (ListPreference) findPreference(LIST_KEY);
    }

    @Override
    protected void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
    }

    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
    }

    // 那一个设置选项栏被触发
    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        return false;
    }

    private class MyOnSharedPreferenceChangeListener implements OnSharedPreferenceChangeListener {

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            if (key.equals(A_KEY)) {
                // 更新
                String s = sharedPreferences.getString(A_KEY, "NULL");
                mEditTextPreference.setSummary(s);
            }

            if (key.equals(LIST_KEY)) {
                String e = mListPreference.getEntry() + "";
                String v = mListPreference.getValue();
                mListPreference.setSummary(e + " : " + v);
            }
        }
    }
}

运行结果:

Android设置Settings:ListPreference【3】

相关文章和文档:
【1】《Android设置Settings实现:PreferenceActivity【1】》链接地址:http://blog.csdn.net/zhangphil/article/details/50154513
【2】《Android设置Settings:预读取设置的选项和更新设置结果【2】》链接地址:http://blog.csdn.net/zhangphil/article/details/50154707
【3】Android谷歌官方Settings开发文档:http://developer.android.com/guide/topics/ui/settings.html

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
盘点JavaScript中数组遍历的全部方式(上篇)
前言JavaScript想必大家都不陌生了,其中的字符串和数组大家经常都会用到,今天就让我们来说说这里面的数组对象的遍历吧,因为遍历经常使用的缘故,所以小编带着大家来解锁遍历的所有方法,以便大家能够更深入的了解数组遍历,并在实际项目中灵活运用。一、Entries这个是ES6中提供的用于遍历数组的方法,它会返回一个遍历器对象,Entries是对键值对的遍历。
凯特林 凯特林
3年前
移动端H5开发常用技巧总结
html篇常用的meta属性设置meta对于移动端的一些特殊属性,可根据需要自行设置<meta name"screenorientation" content"portrait" //Android 禁止屏幕旋转<meta name"fullscreen" content"yes"             //全屏显示
风斗 风斗
3年前
Android 通知栏使用
不同版本通知栏的创建方式不尽相同,当前官方推荐使用NotificationCompat相关的API,兼容到Android4.0,但是部分新功能,比如内嵌回复操作,旧版本是无法支持的。一、设置通知内容//CHANNEL_ID,渠道ID,Android8.0及更高版本必须要设置NotificationCompat.Builde
Stella981 Stella981
3年前
Android端穿山甲SDK集成
Android端穿山甲SDK集成SDK接入穿山甲平台上创建测试状态的应用ID和广告位ID(ps:测试集成完毕后再把应用及对应的代码位改成正式状态)(ps:应用ID和代码位ID是对应关系一个应用可以对应多个代码位ID)应用ID对应demo中的APPID
Stella981 Stella981
3年前
Android的webview的设置参数
WebViewwebTestfindViewById(R.id.webview);WebSettingssettingswebTest.getSettings();settings.setJavaScriptEnabled(true);settings.setJav
Stella981 Stella981
3年前
Eclipse中的.classpath .project .settings
.ClassPath1、<classpathentryexported"true"kind"con"path"org.eclipse.jdt.launching.JRE\_CONTAINER"/  每个新建java工程都默认存在的,其实指的是jre,con即是container,就是程序运行的容器,或者
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
3年前
IOS 获取手机设备信息
回顾一下,Android中获取手机设备相关信息:通过android.os.Build、context.getResources().getDisplayMetrics()、Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID\_ID)、(Telephon
Stella981 Stella981
3年前
Maven setting配置
注意:最好在各自目录下修改setting文件 路径~/.m2目录下1.设置Http代理<settings...<proxies<!可以设置多个代理(多个proxy元素)默认地址一个激活(activetrue)的代理生效<!
Stella981 Stella981
3年前
Chrome浏览器配置&小技巧(面向非技术人员)
注:本文仅面向电脑小白或者非技术人员分享一些常用的Chrome浏览器配置和小技巧一、管理搜索引擎进入搜索引擎管理界面:可以直接在地址栏右键修改搜索引擎,或者进入设置页面选择搜索引擎条目进入设置页面:单击浏览器右上角三点标志选择设置菜单,或者直接在地址栏输入:chrome://settings(chrome://settings