服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中PreferenceActivity使用详解

Android中PreferenceActivity使用详解

2021-12-23 13:10Ang_qq_252390816 Android

本文主要介绍了Android中PreferenceActivity使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一,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,运行看一下效果图如下:

Android中PreferenceActivity使用详解

注意:运行时候,会自动在/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,运行后的效果图:

Android中PreferenceActivity使用详解

注意:ListFragment导入importandroid.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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/ezconn/article/details/91452516

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03