您的位置:首页 > Web前端

Preference的使用 (转自恺风)

2015-10-13 09:43 148 查看
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">

    <!-- 有四个基本组建,这个例子学习两个。里面的内容对照图,很容易理解,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方式一样,代码很简单。和以往界面最大的区别是,我们对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是一一对应的。

PreferenceActivity类的addPreferencesFromResource()在android 3.0之后过期失效,就上网查资料发现需要用PreferenceFragment来替换实现,参考网上资料建立一个PrefsFragement类继承PreferenceFragment,然后用该类来创建菜单。
然后发现,菜单创建成功了,然而按一次返回键之后发现回不到主界面,就各种查资料,发现都是这样实现的呀,没找到原因。
后又分析代码,发现fragmentTransaction.addToBackStack(null);这一句,为什么是参数是null呢?又查函数,发现该函数的
用处:在调用commint()之前,你可以用addToBackStack()把事务添加到一个后退栈中,这个后退栈属于所在的activity。
有了它,就可以在用户按下返回键时,返回到fragment们执行事务之前的状态。明白原来是它在作怪,别人的实例是直接在
主Activity中来加载xml,用做举例,而我需要的是在我点设置之后转到设置的Activity,把该句删掉,就成功实现了点返回
键回到主界面了。
public class PrefsFragement extends PreferenceFragment{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}

<pre name="code" class="java">public class Prefs extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
PrefsFragement fragment1 = new PrefsFragement();
fragmentTransaction.replace(android.R.id.content, fragment1);
fragmentTransaction.addToBackStack(null);//!!!!!!

fragmentTransaction.commit();
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: