返回顶部
首页 > 资讯 > 后端开发 > Python >Android中PreferenceActivity使用详解
  • 515
分享到

Android中PreferenceActivity使用详解

2024-04-02 19:04:59 515人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一,Preference介绍二,PreferencesActivity介绍三,PreferenceActivity的使用四,PreferenceActivity分别和ListFr

一,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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android中PreferenceActivity使用详解

本文链接: https://lsjlt.com/news/135036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作