Android:Preference

在Android源码的中,很多UI布局采用了Preference的布局方式。Preference的布局与view的布局基本相似,其布局文件位于res/xml中。在Preference中,包括PreferenceScreen和PreferenceCategory最重要的基本组合组件,它们是PreferenceGoup的子类。
PreferenceScreen是表示Preference的根节点,可以将包括Preference及其子类的组件组合起来,类似于ListView的方式来组合分布。   
Preferencecategory则类似于LinearLayout等layout布局,用于组合Preference及其子类组件。

PreferenceScreen的示例:

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

    <PreferenceScreen
        android:title="第一行"
        android:key="one_row"
        android:summary="第一行小标题"/>

    <Preference
        android:key="two_row"
        android:title="第二行" />
    <ListPreference
        android:key="three_row"
        android:title="第三行"
        android:dialogTitle="第三行的对话框"
        android:entries="@array/preferred_network_mode_choices"
        android:entryValues="@array/preferred_network_mode_values"/>
</PreferenceScreen>

---

关于Preference的通用xml Attribute说明:   
**android:key**  : 类似于view的ID,表示Preference控件唯一的ID号   
**android:defaultValue**  :默认值,如果在持久化存储中没有找到相应的首选项,即设置为默认值  
**android:enabled** : 表示Preference是否处于可选状态  
**android:title**  :Preference的标题,Preference第一行显示的标题内容   
**android: summary** :prefercnce的副标题,Preference第二行像是的小标题内容  
**android:persistent** :是否将Preference的值写入到sharedPreference中,若为true,即写入  
**android:dependency** :表该Preference依赖的其它Preference,如手机的信号就依赖于飞行模式   
**android:disdependency** :表两个Preference是互斥的关系   
**android:fragment** :用于单击跳转

---

ListPreference 继承了DialogPreference,所以其也继承了继承了DialogPreference的不少特性。   
**android:dialogtitle** :当单击该Preference时,将跳出一个Dialog对象,其标题即为该string   
**android:entries**   :类型是array,控件可以显示的内容,即用户可以直接看到的 ,比如,设置了**android:dialogtitle**,即其在dialog界面显示    
**android:entryValues** :与android:entries组合起来类似于Map(key— value),其主要用于SharedPreference保存的值(android:entries,android:entryValues)

---
在java文件中,加载xml文件。

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

此时组件已经全部加载,如若希望加载部分组件,即可以采用获取PreferenceScreen根对象,然后再加载的办法。

        PreferenceScreen pst = getPreferenceScreen();
        pst.removeAll(); //清空所有组件元素
        PreferenceScreen preferenceScreen_one= (PreferenceScreen) pst.findPreference(KEY_ONE_ROW);  //获得组件对象
        Preference preference_two=pst.findPreference(KEY_TWO_ROW);
        ListPreference listPst_three= (ListPreference) pst.findPreference(KEY_THREE_ROW);
        
        pst.addPreference(preferenceScreen_one);//为pst添加组件元素
        pst.addPreference(preference_two);
        pst.addPreference(listPst_three);


同时,如果PreferenceScreen或PreferenceCategory下嵌套PreferenceScreen,嵌套下的PreferenceCreen中嵌套的内容将在第二屏显示,而不是直接显示在当前屏幕中。若嵌套下的PreferenceScreen没有嵌套内容,只有其本身,即在当前屏幕显示。即嵌套下PreferenceScreen,其本身会在当前屏幕显示,其内容将在单击PreferenceScreen组件后在其他屏幕显示。

---


关于Preference的跳转,其主要有三个方式可以实现。  
第一种   利用其属性android:fragment来处理。
 

    <PreferenceScreen
        android:key="wifi_calling_settings"
        android:title="@string/wifi_calling_settings_title"
        settings:keywords="@string/keywords_wifi_calling"
        android:fragment="com.android.settings.WifiCallingSettings" />

第二种,利用Intent来处理

    <PreferenceScreen
        android:key="mobile_network_settings"
        android:title="@string/network_settings_title"
        settings:keywords="@string/keywords_more_mobile_networks"
        android:dependency="toggle_airplane">
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.android.phone"
            android:targetClass="com.android.phone.MobileNetworkSettings" />
    </PreferenceScreen>


第三种,第二种可以采用onPreferenceTreeClick()创建新的intent显示的进行跳转。

  public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        log("onPreferenceTreeClick: preference=" + preference);
        if (preference == mAirplaneModePreference && Boolean.parseBoolean(
                SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
                       startActivityForResult(
                new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
                REQUEST_CODE_EXIT_ECM);
            return true;
        } else if (preference == findPreference(KEY_MANAGE_MOBILE_PLAN)) {
            onManageMobilePlanClick();
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值