PreferenceActivity和PreferenceFragment实现设置界面

在进行Android开发的过程中,有时需要实现一个设置界面,就像下面的系统的显示设置。这样的界面自己实现起来略显繁琐,好在Android中已经实现了这样的设置界面,那就是PreferenceActivity。并且PreferenceActivity还有一个莫大的好处,配置信息会自动使用SharedPreferences进行保存,无需我们自己实现。

PreferenceActivityPreferenceFragment结合使用,其中PreferenceActivity只是负责加载选项设置列表的布局文件。

1、现在res目录下新建xml目录,建立preference_home.xml文件

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

    <header
        android:fragment="com.sunny.handlertest.MyPreferenceActivity$Prefs1Fragment"
        android:icon="@mipmap/ic_launcher"
        android:summary="设置第一个参数"
        android:title="设置1" />

    <header
        android:fragment="com.sunny.handlertest.MyPreferenceActivity$Pref2Fragment"
        android:icon="@mipmap/ic_launcher"
        android:summary="设置第二个参数"
        android:title="设置2" />

    <header
        android:icon="@mipmap/ic_launcher"
        android:summary="view baidu website"
        android:title="baidu">
        <intent
            android:action="android.intent.action.VIEW"
            android:data="https://m.baidu.com/" />
    </header>

</preference-headers>

每一项header设置点击后的fragment路径,标题,图标等。

并且可以加入intent,如第三个header,点击以后会打开百度的网站。

 

2、MyPreferenceActivity并继承PreferenceActivity

public class MyPreferenceActivity extends PreferenceActivity {

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

        if (hasHeaders()) {
            Button button = new Button(this);
            button.setText("Exit");
            setListFooter(button);
        }
    }

    @Override
    protected boolean isValidFragment(String fragmentName) {
        System.out.println(fragmentName);
        return true;
    }

    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.preference_home, target);
    }

    public static class Prefs1Fragment extends PreferenceFragment {

    }

    public static class Pref2Fragment extends PreferenceFragment {

    }

}  

onCreate中,我们可以利用setListFooter()给界面设置一个底部按钮之类的东西。
要想加载配置文件,需要重写onBuildHeaders()方法,并使用loadHeadersFromResource(R.xml.preference_home, target)来加载我们的配置文件。
需要注意的是,在Android 4.4及以上的的版本中,还要实现isValidFragment()方法,否则会有运行时错误,这个回调函数,会传递给我们fragment类的路径,我们要判断是否是有效路径,如果是,就返回true。在这里为了简单,直接返回true


3、创建preference_frag1.xml

<?xml version="1.0" encoding="utf-8"?>
  <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  
      <PreferenceCategory android:title="设置组1">
          <EditTextPreference
              android:dialogTitle="输入您的名字"
              android:key="name"
              android:singleLine="true"
              android:summary="设置您的姓名"
              android:title="姓名" />
  
          <ListPreference
              android:dialogTitle="选择性别"
              android:entries="@array/sex_name"
              android:entryValues="@array/sex_value"
              android:key="sex"
              android:summary="选择您的性别"
              android:title="性别" />
      </PreferenceCategory>
  
      <PreferenceCategory android:title="设置组2">
  
          <CheckBoxPreference
              android:defaultValue="true"
              android:key="isOk"
              android:summaryOff="关闭"
              android:summaryOn="打开"
              android:title="推送" />
  
          <SwitchPreference
              android:defaultValue="false"
              android:key="autoRun"
              android:summaryOff="关"
              android:summaryOn="开"
              android:title="自启动" />
      </PreferenceCategory>
  
  </PreferenceScreen>

需要注意如下几点,每一项要设置一个key,这是每一个设置的键,在代码中,可以通过这个键找到对应的PreferenceListPreference要配置entriesentryValues这两个属性,是数组类型,分别代表显示出来的选项和存储的值


string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="sex_name">
        <item>男</item>
        <item>女</item>
    </string-array>

    <string-array name="sex_value">
        <item>1</item>
        <item>0</item>
    </string-array>
</resources>


PreferenceCategory用于设置分组;EditTextPreference是含有EditText的对话框;ListPreference是含有单选列表的对话框;CheckBoxPreference是单选项;SwitchPreference是开关。


我在在Prefs1FragmentonCreate方法中使用addPreferencesFromResource(R.xml.preference_frag1)就可以载入我们的配置文件啦。通过findPreference()方法,还可以找到key对应的配置

public static class Prefs1Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preference_frag1);

            String name = ((EditTextPreference) findPreference("name")).getText();
            Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();
        }
    }

展示效果:

 

小小demo,更加熟练地使用PreferenceFragment,弄了一早上!

参考地址:https://www.jianshu.com/p/6b8999ecd47b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值