Android实现设置界面

⌚Time: 2022-08-21 20:55:17

👨‍💻Author: Jack Ge

使用PreferenceActivity建立设置界面的好处就是它可以在程序数据文件夹下建立设置目录,自动保存设置的数据。即便软件重新启动,也会保存原有的设置。只需要通过相应的方法去读取就可以了,而无需手动去实现设置的保存和读取过程

建立res/xml文件夹

文件夹名称和类型都是xml

对xml文件夹右键,new,xml resource file

点击text编辑xml,添加一个ListPreference


    <ListPreference

        android:key="select_fruit"

        android:title="选择水果"

        android:entries="@array/fruits"

        android:entryValues="@array/fruits_values"

        android:summary="选择一个你喜欢的水果"

        android:defaultValue="0"  />

android:key是设置的键,相当于id,title是设置项标题,android:summary是标题下方的提示,android:defaultValue是默认选择第几项,设置为0就是选择List中第0项

android:entries和android:entryValues就是列表项以及对应的值,其中"@array/fruits"和"@array/fruits_values"定义在res\values\strings.xml

strings.xml


<resources>

    <string name="app_name">My Application</string>

    <string-array name="fruits">

        <item>apple</item>

        <item>banana</item>

        <item>juice</item>

        <item>watermelon</item>

    </string-array>

    <string-array name="fruits_values">

        <item>苹果</item>

        <item>香蕉</item>

        <item>橘子</item>

        <item>西瓜</item>

    </string-array>

</resources>


另外添加种类分界线


<PreferenceCategory android:title="Category 1"/>

添加普通项


 <Preference

        android:key="About"

        android:title="关于"/>

完整的setting.xml


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

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="Category 1"/>

    <ListPreference

        android:key="select_fruit"

        android:title="选择水果"

        android:entries="@array/fruits"

        android:entryValues="@array/fruits_values"

        android:summary="选择一个你喜欢的水果"

        android:defaultValue="0"  />

    <PreferenceCategory android:title="Category 2"/>

    <Preference

        android:key="About"

        android:title="关于"/>

    <Preference

        android:key="Help"

        android:title="帮助"/>

</PreferenceScreen>

新建一个类SettingActivity,继承PreferenceActivity

在Oncreate函数中加载setting.xml


    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.setting);

    }

对于ListPreference,如何在选项改变时得到所选值,SettingActivity中为它添加监听函数


ListPreference listPreference = (ListPreference)findPreference("select_fruit");

        listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override

            public boolean onPreferenceChange(Preference preference, Object o) {

                //发送提示消息,选择项的值

                Toast.makeText(getBaseContext(),String.valueOf(o),Toast.LENGTH_SHORT).show();



                //返回值是真选择才会有效

                return true;

            }

        });

对于Preference的点击如何响应?覆写SettingActivity的onPreferenceTreeClick函数


    @Override

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {

        //判断键,来确定是哪个设置项被点击了

        if("About".equals(preference.getKey())){

            Toast.makeText(getBaseContext(),"About clicked!",Toast.LENGTH_SHORT).show();



        }

        if("Help".equals(preference.getKey())){

            Toast.makeText(getBaseContext(),"Help clicked!",Toast.LENGTH_SHORT).show();



        }



        return super.onPreferenceTreeClick(preferenceScreen, preference);

    }

如何打开设置界面,对于SettingActivity,是一个Activity,通过以下代码新打开一个Activity


        Intent intent = new Intent();

        intent.setClass(MainActivity.this,SettingActivity.class);

        startActivity(intent);

别忘了在AndroidManifest.xml加入activity


<activity android:name=".SettingActivity"></activity>

有时候在程序初始化时需要由MainActivity导入设置,那么如何在其他类中使用设置


        SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(this);

        //获取设置的键对应的值,参数一是key,参数二是获取不到key值时返回的默认值

        String favoriteFruit = pre.getString("select_fruit","0");

结果: