`

使用PreferenceFragment快速实现app设置页面

阅读更多

现在的app基本都会有一些设置界面,有些数据需要保存到服务器,而有些数据只需保存到本地,对于保存到本地的操作,相信大家一般都会使用SharedPreference实现,然后自己动手写一个设置页面,大概花了半天时间弄完了,感觉自己萌萌哒。殊不知,还有一种更为简单的方法,就是PreferenceFragment,连界面布局都不用自己写,就能实现类似于android设置界面那样的效果,关键是,省时间,我刚刚大概测试了一下,从创工程到实现效果用了不到20分钟!!!而且最大的好处是,完全符合谷歌官方推出的Material Design,整体性上非常的统一和谐。先来看看效果。





 
 

一、创建一个xml资源文件,如setting.xml

 

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="分类一">
        <SwitchPreference
            android:icon="@drawable/ic_settings_24dp"
            android:key="wifi"
            android:summaryOff="禁用"
            android:summaryOn="启用"
            android:title="WIFI" />
		<CheckBoxPreference
            android:icon="@drawable/ic_settings_24dp"
            android:key="wifi2"
            android:summaryOff="禁用"
            android:summaryOn="启用"
            android:title="WIFI2" />
    </PreferenceCategory>
    <PreferenceCategory android:title="分类二">
        <ListPreference
            android:title="数据更新频率"
            android:key="update_rate"
            android:entries="@array/update_rate"
            android:entryValues="@array/update_rate_value"
            android:summary="默认" />
		<MultiSelectListPreference
            android:title="数据更新频率(多选)"
            android:key="update_rate_muti"
            android:entries="@array/update_rate"
            android:entryValues="@array/update_rate_value"
            android:summary="默认"/>
    </PreferenceCategory>
    <PreferenceCategory android:title="分类三">
        <EditTextPreference
            android:dependency="wifi"
            android:key="wifi_name"
            android:summary="默认值"
            android:title="WIFI Name" />
        <!-- 做简单显示,可以不指定key -->
        <Preference
            android:title="关于"
            android:summary="XXX 工作室" />
        <Preference
            android:title="版本号"
            android:summary="1.0"
            android:enabled="false"
            android:selectable="false"/>
    </PreferenceCategory>
	<PreferenceCategory android:title="分类四">
        <PreferenceScreen
            android:summary="单位、数据源、其他设置......"
            android:title="更多设置">
            <SwitchPreference
                android:title="其他设置"
                android:summary="" />
            <CheckBoxPreference
                android:title="选项"
                android:summary="" />
        </PreferenceScreen>
    </PreferenceCategory>
</PreferenceScreen>

 注意:分类二中的entries需要在strings.xml中定义数组

如下:

 

<string-array name="update_rate">
       <item>一小时</item>
       <item>三小时</item>
       <item>六小时</item>
       <item>半天</item>
       <item>一天</item>
</string-array>
<string-array name="update_rate_value">
       <item>1</item>
       <item>3</item>
       <item>6</item>
       <item>12</item>
       <item>24</item>
</string-array>

 

 

二、创建设置的活动,注意不要使用是支持包的碎片

 

package cn.bill56.preferencesetting;

import android.preference.PreferenceFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 不要设置setcontentview
        if (savedInstanceState == null) {
            SettingFragment settingFragment = new SettingFragment();
            getFragmentManager().beginTransaction()
                    .add(android.R.id.content,settingFragment)
                    .commit();
        }
    }

    public static class SettingFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 加载xml资源文件
            addPreferencesFromResource(R.xml.setting);
        }
    }

}

 

 

 三、运行程序,便可看到效果图所示的效果

选择一些设置后,我们可以查看应用程序内部,看看是否真的保存了数据

打开DBMS,可以看到在程序内部有一个shared_prefs文件夹,展开可以看到保存的选项存储的文件,导入电脑后,打开文件,可看到如下内容(根据自己的操作不同保存的内容肯定不一致):



 

 

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="wifi_name">111</string>
    <boolean name="wifi2" value="true" />
    <set name="update_rate_muti">
        <string>1</string>
        <string>6</string>
        <string>3</string>
    </set>
    <boolean name="wifi" value="true" />
</map>

 

 

这么简单的几行代码就能实现这么负责的功能,看来外面的世界不小,一定要多去看看啊。


 

  • 大小: 19.8 KB
  • 大小: 20 KB
  • 大小: 20.7 KB
  • 大小: 16.3 KB
  • 大小: 12.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics