Android中PreferenceActivity使用详解

目录
  • 一,Preference介绍
  • 二,PreferencesActivity介绍
  • 三,PreferenceActivity的使用
  • 四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用
  • 五,Preference数据获取
  • 总结

一,Preference介绍

Android提供的preference以键值对的方式来处理这种情况:自动保存设置的数据,并立时生效,而这种使用android sharedpreferences方式进行保存的,不需要我们手动来写sharedpreferences;

常见的Preference控件有:

  • 直接子类:DialogPreference, PreferenceGroup, RingtonePreference, TwoStatePreference
  • 非直接子类:CheckBoxPreference, EditTextPreference, ListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference

二,PreferencesActivity介绍

是Android中专门用来实现程序设置界面及参数存储的一个Activity。从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment(此类在API级别28中已弃用。替代类androidx库下的PreferenceFragmentCompat,有关androidx的问题有很多,这里不过多介绍 ),二者用法类似。PreferenceActivity在API级别29中已被弃用。PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件

PreferencesActivity官方介绍文档:

https://developer.android.com/reference/android/preference/PreferenceActivity.html

三,PreferenceActivity的使用

3.1,在res下新建xml目录,在xml目录下新建PreferenceActivity需要的布局文件setting.xml(使用PreferenceScreen 最为根节点)

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

    <ListPreference
        android:key="setting_language_preference"
        android:title="语言设置"
        android:entries="@array/language_entries"
        android:entryValues="@array/language_values"
        android:summary="支持:普通话,粤语,英语,德语,法语"
        android:defaultValue="mandarin"  />

    <EditTextPreference
        android:key="setting_preference"
		android:title="连接超时"
		android:dialogTitle="请输入时间(0-10000)ms"
        android:summary="默认值1800"
		android:defaultValue="1800" />

	<CheckBoxPreference
		android:key="@string/pref_key_translate"
		android:title="Love me ?"
		android:defaultValue="false" />

</PreferenceScreen>

在res/values/strings.xml文件中新建以上需要的资源数据

<string-array name="language_entries">
        <item>普通话</item>
        <item>粤语</item>
        <item>英语</item>
        <item>俄语</item>
        <item>法语</item>
</string-array>
<string-array name="language_values">
        <item>mandarin</item>
        <item>cantonese</item>
        <item>en_us</item>
        <item>russian</item>
        <item>french</item>
</string-array>
<string name="pref_key_translate">love_me</string>

3.2,创建PreferenceActivity的子类SettingActivity

public class SettingActivity extends PreferenceActivity {

    public static final String PREFER_NAME = "setting";
    private EditTextPreference mVadbosPreference;

    @SuppressWarnings("deprecation")
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        getPreferenceManager().setSharedPreferencesName(PREFER_NAME);
        addPreferencesFromResource(R.xml.setting);

        mVadbosPreference = (EditTextPreference)findPreference("setting_preference");

    }

}

3.3,运行看一下效果图如下:

注意:运行时候,会自动在/data/data/<packagename>/shared_prefs/目录生成一个文件名为setting文件;

四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用

PreferenceFragment官方文档:

https://developer.android.com/reference/android/preference/PreferenceFragment

4.1,在res下新建xml目录,在xml目录下新建PreferenceActivity需要的布局文件activity_settings.xml(使用preference-headers

最为根节点,通过header引入Fragment)

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment="com.ang.demo.ui.fragment.ListFragmentSettings"
        android:icon="@drawable/ic_launcher"
        android:title="Settings"
        android:summary="真球忙">
    </header>

    <header
        android:fragment="com.ang.demo.ui.fragment.PreferenceFragmentTest"
        android:title="PreferenceFragmentTest">
    </header>

    <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各个属性的功能作用;

上面header引入ListFragment的子类ListFragmentSettings代码:

public class ListFragmentSettings extends ListFragment {
    protected ArrayAdapter<String> mAdapter;
    protected String mData[];

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mData = getActivity().getResources().getStringArray(R.array.contries);
        mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_single_choice, mData);
        setListAdapter(mAdapter);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_radio_zone_settings, container,false);
        return view;
    }

    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
    }
}

上面header引入PreferenceFragment的子类PreferenceFragmentTest代码:

public class PreferenceFragmentTest extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        //从xml文件加载选项
        addPreferencesFromResource(R.xml.fragment_preference_test);
    }
}

fragment_preference_test布局文件(也是在res/xml/目录下)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 设置的类别 -->
    <PreferenceCategory
        android:key="mylocation"
        android:summary="我的位置源"
        android:title="我的位置">
        <CheckBoxPreference
            android:key="wireless_network"
            android:title="使用GPS"
            android:summary="使用Gps查看应用的位置"
            />
    </PreferenceCategory>

    <PreferenceCategory
        android:key="mymsg"
        android:summary="个人信息s"
        android:title="个人信息">
        <EditTextPreference
            android:key="myname"
            android:title="请输入真实姓名"
            android:summary="姓名"/>
    </PreferenceCategory>

</PreferenceScreen>

4.2,创建PreferenceActivity的子类PreferenceActivityTest(名字都是随便起的)

public class PreferenceActivityTest extends PreferenceActivity {
    private static List<String> fragments = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (hasHeaders()) {
            Button button = new Button(this);
            button.setText("Exit");
            setListFooter(button);
        }
    }

    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Preference选项
        fragments.clear();
        for (Header header : target) {
            fragments.add(header.fragment);
        }
    }

    //android 4.3以上版本需要做验证,验证方式有很多 https://www.manongdao.com/article-73175.html
    @Override
    protected boolean isValidFragment(String fragmentName) {
        return fragments.contains(fragmentName);
    }
}

4.3,运行后的效果图:

注意:ListFragment导入import android.app.ListFragment;别导入V4包下的(切记哦),如果导入V4包下的会出现  java.lang.ClassCastException异常;详细详细异常信息:

java.lang.RuntimeException:Unable to start activity ComponentInfo{com.ang.demo/com.ang.demo.ui.activity.PreferenceActivityTest}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.ang.demo.ui.fragment.ListFragmentSettings that is not a Fragment

五,Preference数据获取

以上都是Preference的使用和保存数据;如何获取Preference的数据呢;其实和shardpreference获取数据一样;通过key获取;

总结

讲了这么多,其实都是 Preference的子类在PreferenceActivity和PreferenceFragment中的应用;以上实现设置的功能,谷歌官方文档推荐使用androidx包下的Preference及子类和PreferenceFragmentCompat;总是还是v4 v7 v13等support 库迁移androidx的问题;

到此这篇关于Android中PreferenceActivity使用详解的文章就介绍到这了,更多相关Android PreferenceActivity内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android之PreferenceActivity应用详解

    为了引入这个概率 首先从需求说起 即:现有某Activity专门用于手机属性设置 那么应该如何做呢? 根据已学知识 很快一个念头闪过 即:Activity + Preference 组合 前者用于界面构建 后者用于设置数据存放 其实 这是正确的 但是 这会比较繁琐 因为 每个设置选项 都要建立与其对应的Preference 所以 现在有更好的选择了 那就是本文的主角:PreferenceActivity 从名字应该可以看出 其实 Activity 与 Perference 的混合物 还是从需求说

  • Android PreferenceActivity与PreferenceFragment详解及简单实例

    Android  PreferenceActivity与PreferenceFragment 前言 转来转去又回到了Android,闲话少说,这里是参考Android原生的Settings应用来介绍一下PreferenceActivity.PreferenceFragment和headers的使用. PreferenceActivity 我们先通过一个简单的例子来学习一下PreferenceActivity的使用. preferences_scenario_1.xml 我们先通过xml文件来定义

  • Android之PreferenceActivity应用详解(2)

    看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找. PerferenceActivity是什么,看下面的截图:               Android系统截图(左)MusicPlayer Setting截图(右) 好了,我们看到Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理,那么它是怎么保存数据的呢,如何创 建PrefenceActivity的呢,更关键是

  • Android中PreferenceActivity使用详解

    目录 一,Preference介绍 二,PreferencesActivity介绍 三,PreferenceActivity的使用 四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用 五,Preference数据获取 总结 一,Preference介绍 Android提供的preference以键值对的方式来处理这种情况:自动保存设置的数据,并立时生效,而这种使用android sharedpreferences方式进行保存的,不

  • Android中menu使用详解

    Menu(菜单)是Android中一定会使用的模块,每个Android项目都会用到Menu来给用户起到选择和导航的作用,提升用户体验,下面通过本文给大家分享android 中menu使用,需要的朋友一起看看吧 很多activity界面中都存在一个菜单栏,就是点击右上角的一个按钮的时候会出现一个下拉列表差不多的东西,这个功能的实现其实只需要下面的两步,每一个activity都可以拥有自己独一无二的menu,具体的格式可以自己进行定义,详细的创建步骤如下 ①在res下的menu中创建file_men

  • Android中Service服务详解(二)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 在前面文章<Android中Service服务详解(一)>中,我们介绍了服务的启动和停止,是调用Context的startService和stopService方法.还有另外一种启动方式和停止方式,即绑定服务和解绑服务,这种方式使服务与启动服务的活动之间的关系更为紧密,可以在活动中告诉服务去做什么事情. 为了说明这种情况,做如下工作: 1.修改Service服务类MyService package com.ex

  • Android中PackageManager使用详解

    目录 前言 引入:AndroidManifest.xml文件节点说明: 相关类的介绍 PackageManger 类 PackageInfo类 PackageItemInfo类 ApplicationInfo类 继承自  PackageItemInfo ActivityInfo类  继承自 PackageItemInfo ServiceInfo 类 总结 前言 Android系统为我们提供了很多服务管理类,包括ActivityManager.PowerManager(电源管理).AudioMan

  • Android中CountDownTimer类详解

    一.概述 项目中经常用到倒计时的功能,比如说限时抢购,手机获取验证码等等.而google官方也帮我们封装好了一个类:CountDownTimer,使我们的开发更加方便: 二.API CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单 public abstract void onTick(long millisUntilFinished);//这个是每次间隔指定时间的回调,millisUntilFinished:剩余的时间,单位毫秒 public abstract voi

  • Android中的存储详解

    目录 1.存储在App内部 2.SD卡外部存储 3.SharedPreferences存储 4.使用SQLite数据库存储 4.1 自己完成一个BaseDao类 4.2 使用Google写的API处理 4.3 事务使用 总结 1.存储在App内部 最简单的一种.在尝试过程中发现,手机中很多文件夹都没有权限读写.我们可以将我们需要写的文件存放到App中的files文件夹中,当然我们有权限在整个App中读写文件 可以通过API获取一个file对象,这里的this就是MainActivity类 //

  • android中Context深入详解

    以下分别通过Context认知角度,继承关系,对象创建等方面android中Context做了深入的解释,一起学习下. 1.Context认知. Context译为场景,一个应用程序可以认为是一个工作环境,在这个工作环境中可以存在许多场景,coding代码的场景 ,打电话的场景,开会的场景.这些场景可以类比不同的Activity,service. 2.从两个角度认识Context. 第一:Activity继承自Context,同时Activity还实现了其他的interface,我们可以这样看,

  • Android中Intent机制详解及示例总结(总结篇)

    最近在进行android开发过程中,在将 Intent传递给调用的组件并完成组件的调用时遇到点困难,并且之前对Intent的学习也是一知半解,最近特意为此拿出一些时间,对Intent部分进行了系统的学习并进行了部分实践,下面将自己的学习及Intent知识进行了详细的归纳整理,希望能帮助到同样遇到相同问题的博友. 下面是Intent介绍.详解及Intent示例总结: 一.Intent介绍: Intent的中文意思是"意图,意向",在Android中提供了Intent机制来协助应用间的交互

  • Android中 service组件详解

    service组件跟activity组件及其类似,可以说service是没有界面的activity, 当然service的生命周期和activity还是有一定的差别的. service组件一般用在什么地方的,上面讲了service组件没有界面,不用跟用户直接交互, 所以service组件一般运行在后台.比如做一些不需要界面的数据处理等等. 开发service需要两个步骤: 1,定义一个基础service的子类.     2,在AndroidManifest.xml 文件中配置该service.

  • Android中处理apple-touch-icon详解

    苹果的Touch Icon相对我们都比较熟悉,是苹果为了支持网络应用(或者说网页)添加到桌面需要的图标,有了这些Touch Icon的网页链接更加和Native应用更相像了.由于苹果设备IPod,IPhone,IPad等设备广泛,很多网页都提供了touch icon这种图标资源.由于Android中并没有及早的有一份这样的标准,当我们想把网页添加到桌面时,仍然需要使用苹果的Touch Icon. Touch Icon 当我们想让一个网页比较完美地添加到桌面,通常情况下我们需要设置一个png图片文

随机推荐