Android 基础知识系列之 Preference

640?wx_fmt=gif

640?wx_fmt=gif

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能

640?wx_fmt=jpeg

Preference 在Android 中重要的控件之一,比如 Settings 模块大部分都是通过Preference 实现的,本章将研究preference 使用方法

  1. Perference 简介

  2. Perference 使用方法

  3. 使用XML定义Preference

  4. 使用Fragment 定义Preference

  5. 实现效果

1.Preference 简介

  • Preference 继承关系

java.lang.Object
    ↳ android.preference.Preference 

Preference 常用于APP 设置模块,比如 Android 系统中的Settings 模块,它可以默认把我们的数据保存在SharePreference中。

640?wx_fmt=png

settings中常用Preference 举例

  • 键值对获取方法同SharePreference

SharedPreferences mSp = PreferenceManager.getDefaultSharedPreferences(this);
String favPhone=mSp.getString(PREF_LISTPHONE, "MI");
  • Prefernce 数据保存

Preference通过key-values 键值对的形式保存在/data/data/包名/shared_prefs/包名_preferences.xml

640?wx_fmt=png

image.png

2. Perference 使用方法

一般在XML文件夹中创建xml 文件来对Settings进行布局,布局文件中通常使用PreferenceScreen容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类标题。

常用Preference 控件如下:

上面控件等同Layout布局中的View,PreferenceScreen 等同Layout布局中的ViewGroup。在Android 3.0 之前需要继承PreferenceActivity(此方法不是太推荐使用,已被启用),3.0 之后更高版本,则需要继承Activity,使用Fragment 控制布局,然后实现不同控件的处理事件。

Perference 常用使用方法如下两种:

  1. 使用XML定义Preference

  1. 使用Fragment 定义Preference

3. 使用XML定义Preference

此方法有点过时,不太建议使用,但目前还可以用。

  1. 将XML 文件保存在 res/xml/ 目录中 例如: preferences.xml

  2. 继承PreferenceActivity在 oncreate方法中直接调用addPreferencesFromResource(R.xml.preference);添加布局

  3. 点击事件处理setOnPreferenceClickListener ,内容发生改变事件处理 setOnPreferenceChangeListener

Demo 如下:

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

    <Preference
        android:key="about_phone"
        android:summary="@string/pref_about_phone_sum"
        android:title="@string/pref_about_phone_tittle" />

    <RingtonePreference
        android:key="pref_ring"
        android:summary="@string/pref_ringtone_tittle"
        android:title="@string/pref_ringtone_sum" />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="pref_blue"
        android:summary="@string/preference_blue_sum"
        android:title="@string/preference_blue_tittle" />

    <PreferenceCategory
        android:key="pref_fav_category"
        android:title="@string/pref_fav_category_tittle" >
        <EditTextPreference
            android:key="fav_city"
            android:summary="@string/pref_ed_name_sum"
            android:title="@string/pref_ed_name_tittle" />

        <ListPreference
            android:defaultValue="@array/fav_phone"
            android:dialogTitle="@string/pref_fav_title"
            android:entries="@array/fav_phone"
            android:entryValues="@array/fav_phone"
            android:key="pref_fav_phone"
            android:summary="@string/pref_fav_sum"
            android:title="@string/pref_fav_title" />
    </PreferenceCategory>
    <PreferenceCategory
        android:key="pref_contact_category"
        android:title="@string/pref_fav_contact_tittle" />

    <PreferenceScreen
        android:key="pre_voicemail_setting_key"
        android:persistent="false"
        android:title="@string/pref_voicemail_tittle" >
        <Preference
            android:key="voice_mail"
            android:summary="@string/pref_voicemail_tittle"
            android:title="@string/pref_voicemail_sum" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </Preference>
    </PreferenceScreen>

</PreferenceScreen>

Activity 处理方法

public class PreferenceMethods extends PreferenceActivity implements OnPreferenceClickListener, OnPreferenceChangeListener {
    
    public static final String PREF_BLUE="pref_blue";
    public static final String PREF_LISTPHONE="pref_fav_phone";
    public static final String PREF_CITY="fav_city";
    public static final String PREF_RING="pref_ring";
    
    private CheckBoxPreference  mBlueCheckPreference;
    private ListPreference mFavPhoneListPreference;
    private EditTextPreference mFavCityEdPreference;
    private RingtonePreference mRingtonePreference;
    private SharedPreferences mSp;
    boolean isCheck;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        
        mSp = PreferenceManager.getDefaultSharedPreferences(this);
        
        isCheck = mSp.getBoolean(PREF_BLUE, true);
        String favPhone=mSp.getString(PREF_LISTPHONE, "MI");
        
        mBlueCheckPreference=(CheckBoxPreference) findPreference(PREF_BLUE);
        mFavPhoneListPreference=(ListPreference) findPreference(PREF_LISTPHONE);
        mFavCityEdPreference=(EditTextPreference) findPreference(PREF_CITY);
        mRingtonePreference=(RingtonePreference) findPreference(PREF_RING);
        
        mFavPhoneListPreference.setSummary(favPhone);
        mFavPhoneListPreference.setOnPreferenceClickListener(this);
        mFavPhoneListPreference.setOnPreferenceChangeListener(this);
        
        mBlueCheckPreference.setChecked(isCheck);
        mBlueCheckPreference.setOnPreferenceClickListener(this);
        mBlueCheckPreference.setOnPreferenceChangeListener(this);
        
        String favCity=mSp.getString(PREF_CITY, "成都");
        mFavCityEdPreference.setOnPreferenceClickListener(this);
        mFavCityEdPreference.setOnPreferenceChangeListener(this);
        mFavCityEdPreference.setSummary(favCity);
        
        String favRingtone=mSp.getString(PREF_RING, "十年");
        mRingtonePreference.setSummary(favRingtone);
        mRingtonePreference.setOnPreferenceChangeListener(this);
        mRingtonePreference.setOnPreferenceClickListener(this);
    }
    @Override
    public boolean onPreferenceClick(Preference preference) {
        return true;
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        
        if (mBlueCheckPreference.equals(preference)) {
            isCheck=!isCheck;
            mBlueCheckPreference.setChecked(isCheck);
        }
        
        if (mFavPhoneListPreference.equals(preference)) {
            mFavPhoneListPreference.setSummary(newValue.toString());
        }
        
        if (mFavCityEdPreference.equals(preference)) {
            mFavCityEdPreference.setSummary(newValue.toString());
        }
        if (preference.equals(mRingtonePreference)) {
            
            mRingtonePreference.setSummary(newValue.toString());
        }
        return true;
    }
}

4. 使用Fragment 定义Preference

此方法比较建议是使用,如需了解Fragment 使用方法,请看Fragment使用方法详解http://www.jianshu.com/p/0bf6a32baa1a

  1. 首先自定Fragment片段

public class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preference);
    }
}
  1. Activity 中调用Fragment

public class SettingPreferenceActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preference);

        getFragmentManager().beginTransaction()
                .replace(R.id.fm_pref, new SettingsFragment()).commit();
    }

}
  • 填充布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/fm_pref"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
  1. xml 布局同上

5.实现效果如下:

640?wx_fmt=png

Preference使用方法详解

640?wx_fmt=jpeg

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

640?wx_fmt=jpeg

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。640?wx_fmt=other

既然都看到这里,领两个红包在走吧!以下两个红包每天都可以领取

1.支付宝搜索 522398497,或扫码支付宝红包海报。

支付宝扫一扫,每天领取大红包

2.微信红包,微信扫一扫即可领取红包

微信扫一扫,每天领取微信红包

posted @ 2018-12-14 09:46  程序员Android的博客  阅读(479)  评论(0编辑  收藏  举报