Android开发之PreferenceActivity的使用

PreferenceActivity

在开发应用程序时,有时我们会有选项设置界面,通常我们可以使用SharePreference以键值对的形式进行保存。Android为我们提供了PreferenceActivity。PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。
我们只要把Activity继承PreferenceActivity, PreferenceActivity会帮我们处理选项的读写。从Android3.0开始,官方不推荐单独使用PreferenceActivity,而是建议PreferenceActivity与PreferenceFragment结合使用。

PreferenceActivity结合PreferenceFragment实现选项设置

官方建议PreferenceActivity与PreferenceFragment结合使用,其中PreferenceActivity负责加载选项配置列表的布局文件,PreferenceFragment负责加载选项配置的布局文件。

在res下创建xml目录来创建布局

例如:
PreferenceActivity加载的布局如下,不是layout,而是preference-headers。

res/xml/pref_headers.xml


    
    

我们可以通过android:fragment来指定启动PreferenceFragment,当然了,也可以通过Intent来启动指定Activity。

Activity:

public class PreferenceActivityWithPreferenceFragment extends AppCompatPreferenceActivity {

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


    @Override
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onBuildHeaders(List
target) { //加载选项列表布局 loadHeadersFromResource(R.xml.pref_headers, target); } /** * 验证Preference是否有效 * * @param fragmentName * @return */ protected boolean isValidFragment(String fragmentName) { return true; } /** * GeneralPreferenceFragment */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class GeneralPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_general); } } }
  • PreferenceActivity负责加载选项配置列表的布局文件
    preference-headers根标签相当于一个列表,header标签相当于每个Item。
Android开发之PreferenceActivity的使用_第1张图片

如下:

Android开发之PreferenceActivity的使用_第2张图片
  • PreferenceFragment负责加载选项配置的布局文件
    res/xml/pref_general.xml
Android开发之PreferenceActivity的使用_第3张图片


    
    

如下:

Android开发之PreferenceActivity的使用_第4张图片

完成效果如下:

  • 我们来看看提供了哪几种布局元素可供使用
Android开发之PreferenceActivity的使用_第5张图片

1.CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:

2.EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。
3.ListPreference: 列表选择,弹出对话框供选择。
4.Preference:只进行文本显示,需要与其他进行组合使用。
5.PreferenceCategory:用于分组。效果如下:

Android开发之PreferenceActivity的使用_第6张图片

6.PreferenceScreen:PreferenceActivity的根元素。
7.RingtonePreference:系统铃声选择。
8.MultiSelectListPreference:列表选择(多选)
9.SwitchPreference:Switch

接着上面,PreferenceFragment布局修改如下:
res/xml/pref_general.xml布局


    
        
    
    
        
        
        
        
    

android:entries="@array/city"
android:entryValues="@array/country"


        北京
        上海
        广州
        深圳
    
    
        A
        B
        C
        D
    

效果如图:


Android开发之PreferenceActivity的使用_第7张图片

PreferenceCategory属性:

key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息。
title:显示标题(大字体显示)
summary:副标题(小字体显示)
defaultValue:默认值
dependency:附属,即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。当CheckPreference值为true时,Preference则为可用,否则为不可用。
dialogTitle:弹出对话框的标题
entries:列表中显示的值。为一个数组,通常通过资源文件进行设置。
entryValues:列表中实际保存的值,与entries对应。(上面的city和county)

写个例子

例子直接用的Activity结合PreferenceFragment实现
我们用PreferenceScreen来实现下图布局

Android开发之PreferenceActivity的使用_第8张图片

res/xml/pref_my.xml布局



    
    
    
    
    
    
    
    

MyFragment:

public class MyFragment extends PreferenceFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
        addPreferencesFromResource(R.xml.pref_my);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Preference one = findPreference("one");
        one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "再点一下试试", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "试试就试试", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }
}

Activity:

public class ActivityWithPreferenceFragment extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_with_preference_fragment);

        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fl, new MyFragment()).commit();
    }
}
Android开发之PreferenceActivity的使用_第9张图片

开篇有说到Preference以键值对的形式进行保存,所以我给每一项设置了一个key。这个的作用和我们常用的id差不多,一会如果我们要引用这个组件可以通过key来找到他。

我们来加几个点击事件
OnPreferenceClickListener 用来监听某个选项是否被点击

public class MyFragment extends PreferenceFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
        addPreferencesFromResource(R.xml.pref_my);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Preference one = findPreference("one");
        one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "再点一下试试", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(getActivity(), "试试就试试", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    }
}

通过key找到对应组件
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
运行一下:


Android开发之PreferenceActivity的使用_第10张图片

程序的完整源代码
GitHub:https://github.com/Rairmmd/RairDemo/
Coding:https://git.coding.net/Rair/RairDemo.git

你可能感兴趣的:(Android开发之PreferenceActivity的使用)