zoukankan      html  css  js  c++  java
  • Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项。一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况,自己主动保存这些数据,并立时生效,同一时候Android提供一种类似的layout的方式来进行Prefernce的布局。

    一个简单的Preferenece样例

    步骤1:编写preference XML,在res/xml/下增加我们的preference XML文件,比如名字叫c21preference.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!-- preference的组织方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是带层次组织关系,在后面的样例体验,而PreferenceScreen就是最平白和基础的方式 -->
    <PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
       
    <!-- 有四个基本组建,这个样例学习两个。里面的内容对比图,非常easy理解,RingtonePreference是选择铃音,这里给出两个选择,系统默认的铃音和无声 -->
        <CheckBoxPreference android:key="
    checkbox"
            android:title="
    CheckBox Preference"
            android:summary="
    Check it on , check it off"/>
        <RingtonePreference android:key="
    ringtone"
            android:title="
    Ringtone Preference"
            android:showDefault="
    true"
            android:showSilent="
    true"
            android:summary="
    Pick a tone, any tone"/>
    </PreferenceScreen>

    步骤2:在java源码中调用该xml,生成对应的preference界面

    public class Chapter21Test1 extendsPreferenceActivity{
      
     @Override
        protected void onCreate(Bundle savedInstanceState) {
           
    super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.c21preference);
        }
    }

    和用layout方式一样,代码非常easy。和以往界面最大的差别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入,上次的选项依旧保留,我们又一次向模拟器load应用,发现之前的选项仍然存在。我们能够利用preference,而无须人工对数据进行保存和读取,非常是方便。

    步骤3:获取preference的数据

    处了在preference的界面中可以保留数据,我们也希望可以读出数据,以便这些数据可以用在其它的activity中。假设还有一个activity和这些数据关联,并且希望可以实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

    首先要获取preferences,然后通过键值对的获取方式依据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String,比如:

        protected void onResume() { //在还有一个Activity中
           
    super.onResume();
            SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
            System.out.println(new Boolean(prefs.getBoolean("
    checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
            System.out.println(prefs.getString("
    ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值
        }

    获取preferences能够通过三种方式:
    一、getPreferences():能够获取同一activity中的preference;
    二、getSharedPreferences():能够获取映用级别的preferences(),在这个样例中因为我们封装在同一app中,也能够使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);当中第一个參数name的格式是<package_name>_preferences;
    三、getDefaultSharedPreferences():就是我们样例的方式,通过Android的偏好管理器来获取其所管理的preferences。

    Preferenece数据的操作

    在上面的样例中,preference的数值会被保留,并且能够在其它的activity中读取。假设须要清除数据,能够通过remove()清除某个名字的prefernece,clear()清除全部的preferences。我们能够通过edit()获取preferences的editor,进而进行编辑,改动后,通过commit()将改动值保存。

    Preferenece XML

    Preference的XML能够通过PreferenceCategory来进行组织。PreferenceCategory能够将几个组建组合在一起,并加上标题。我们依旧用前面的xml样例,通过PreferenceCategory来进行组织,例如以下:和之前的样例比較,将chekcbox和rintong组织成为一个category,并加上了"simple Preferences"的标题。

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
           <PreferenceCategory android:title="Simple Preferences">
                <CheckBoxPreference android:key="checkbox" ..../>
                <RingtonePreference android:key="ringtone" ... />

           </PreferenceCategory>
    </PreferenceScreen>

    PreferenceCategory也能够嵌套PreferenceScreen,PreferenceScreen中的内容,将通过还有一屏来显示,我们在上面样例后面加入一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏,由入PreferenceScreen定义。通过这个关系,我们能够组织自己的preference架构。

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
           <PreferenceCategory android:title="Simple Preferences">
                <CheckBoxPreference android:key="checkbox" ..../>
                <RingtonePreference android:key="ringtone" ... />
           </PreferenceCategory>

           <PreferenceCategory android:title="Detail Screens">
               <PreferenceScreen android:title="Detail"
                   android:summary="Addtional preference help in another page">
                   <CheckBoxPreference
    android:key="checkbox2"
                       android:title="Another Checkbox"
                       android:summary="On or Off, It's a problem...."
    />
               </PreferenceScreen>
           </PreferenceCategory>
    </PreferenceScreen>

    在前面的样例中我们使用了CheckBox和Ringtong,在以下的样例,我们实验另外的两个组建EditText和List,这两种都是已弹框的方式。在上面的样例我们继续添加内容

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen ...>
           ......     

           <PreferenceCategory android:title="Other Preferences">
               <EditTextPreference android:key="text"
                   android:title="
    Text Entry Dialog"
                   android:summary="
    Click to pop up a field for entry"
                   android:dialogTitle="
    Enter something useful"/>
               <ListPreference android:key="list"
                   android:title="
    Selection Dialog"
                   android:summary="
    Click to pop yo a list for select"
                   android:entries="@array/cities"
                   android:entryValues="@array/airport_codes"

                   android:dialogTitle="
    Choose a City"/>
           </PreferenceCategory>
    </PreferenceScreen>

    在list中由两个引用@array/cities和@array/airport_codes,我们在资源文件里定义此两array。内容例如以下:
    <resource>
         <string-array>
            <item>Pittsburgh</item>
            <item>Allentown/Bethlehem</item>
            <item>Erie</item>
            ... ...
        </string-array>
        <string-array name="airport_codes">
            <item>PHL</item>
            <item>PIT</item>
            <item>ABE</item>
            ... ...
        </string-array>
    </resources>

    执行结果如右图所看到的。对于EditText,键值对保存的值是String,即用户在输入框中输入的内容。List的情况略微复杂一些,在设置ListPreference的属性有一个entires,这是在List显示给用户看的内容,假设我们去获取preference的值,在这个样例为prefs.getString("list", "<unset>");,则返回在entryValues相应的数值,比如我们选择了第一个item:Pittsburgh,则获取的值为PHL。entries和entryValues是一一相应的。

    相关链接: 我的Android开发相关文章

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4557317.html
Copyright © 2011-2022 走看看