Android中PreferenceActivity使用详解

网友投稿 1033 2022-12-10

Android中PreferenceActivity使用详解

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 最为根节点)

android:key="setting_language_preference"

android:title="语言设置"

android:entries="@array/language_entries"

android:entryValues="@array/language_values"

android:summary="支持:普通话,粤语,英语,德语,法语"

android:defaultValue="mandarin" />

android:key="setting_preference"

android:title="连接超时"

android:dialogTitle="请输入时间(0-10000)ms"

android:summary="默认值1800"

android:defaultValue="1800" />

android:key="@string/pref_key_translate"

android:title="Love me ?"

android:defaultValue="false" />

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

普通话

粤语

英语

俄语

法语

mandarin

cantonese

en_us

russian

french

love_me

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//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)

android:icon="@drawable/ic_launcher"

android:title="Settings"

android:summary="真球忙">

android:fragment="com.aHRNESaHqng.demo.ui.fragment.PreferenceFragmentTest"

android:title="PreferenceFragmentTest">

android:icon="@mipmap/ic_launcher"

android:summary="view baidu website"

android:title="baidu">

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

注意:header各个属性的功能作用;

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

public clahttp://ss ListFragmentSettings extends ListFragment {

protected ArrayAdapter mAdapter;

protected String mData[];

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mData = getActivity().getResources().getStringArray(R.array.contries);

mAdapter = new ArrayAdapter(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/目录下)

android:key="mylocation"

android:summary="我的位置源"

android:title="我的位置">

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="mymsg"

android:summary="个人信息s"

android:title="个人信息">

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

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

public class PreferenceActivityTest extends PreferenceActivity {

private static List fragments = new ArrayList();

@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

target) {

loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Phttp://reference选项

fragments.clear();

for (Header header : target) {

fragments.add(header.fragment);

}

}

//android 4.3以上版本需要做验证,验证方式有很多 https://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:key="setting_language_preference"

android:title="语言设置"

android:entries="@array/language_entries"

android:entryValues="@array/language_values"

android:summary="支持:普通话,粤语,英语,德语,法语"

android:defaultValue="mandarin" />

android:key="setting_preference"

android:title="连接超时"

android:dialogTitle="请输入时间(0-10000)ms"

android:summary="默认值1800"

android:defaultValue="1800" />

android:key="@string/pref_key_translate"

android:title="Love me ?"

android:defaultValue="false" />

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

普通话

粤语

英语

俄语

法语

mandarin

cantonese

en_us

russian

french

love_me

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//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)

android:icon="@drawable/ic_launcher"

android:title="Settings"

android:summary="真球忙">

android:fragment="com.aHRNESaHqng.demo.ui.fragment.PreferenceFragmentTest"

android:title="PreferenceFragmentTest">

android:icon="@mipmap/ic_launcher"

android:summary="view baidu website"

android:title="baidu">

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

注意:header各个属性的功能作用;

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

public clahttp://ss ListFragmentSettings extends ListFragment {

protected ArrayAdapter mAdapter;

protected String mData[];

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mData = getActivity().getResources().getStringArray(R.array.contries);

mAdapter = new ArrayAdapter(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/目录下)

android:key="mylocation"

android:summary="我的位置源"

android:title="我的位置">

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="mymsg"

android:summary="个人信息s"

android:title="个人信息">

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

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

public class PreferenceActivityTest extends PreferenceActivity {

private static List fragments = new ArrayList();

@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

target) {

loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Phttp://reference选项

fragments.clear();

for (Header header : target) {

fragments.add(header.fragment);

}

}

//android 4.3以上版本需要做验证,验证方式有很多 https://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:key="setting_preference"

android:title="连接超时"

android:dialogTitle="请输入时间(0-10000)ms"

android:summary="默认值1800"

android:defaultValue="1800" />

android:key="@string/pref_key_translate"

android:title="Love me ?"

android:defaultValue="false" />

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

普通话

粤语

英语

俄语

法语

mandarin

cantonese

en_us

russian

french

love_me

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//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)

android:icon="@drawable/ic_launcher"

android:title="Settings"

android:summary="真球忙">

android:fragment="com.aHRNESaHqng.demo.ui.fragment.PreferenceFragmentTest"

android:title="PreferenceFragmentTest">

android:icon="@mipmap/ic_launcher"

android:summary="view baidu website"

android:title="baidu">

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

注意:header各个属性的功能作用;

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

public clahttp://ss ListFragmentSettings extends ListFragment {

protected ArrayAdapter mAdapter;

protected String mData[];

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mData = getActivity().getResources().getStringArray(R.array.contries);

mAdapter = new ArrayAdapter(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/目录下)

android:key="mylocation"

android:summary="我的位置源"

android:title="我的位置">

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="mymsg"

android:summary="个人信息s"

android:title="个人信息">

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

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

public class PreferenceActivityTest extends PreferenceActivity {

private static List fragments = new ArrayList();

@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

target) {

loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Phttp://reference选项

fragments.clear();

for (Header header : target) {

fragments.add(header.fragment);

}

}

//android 4.3以上版本需要做验证,验证方式有很多 https://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:key="@string/pref_key_translate"

android:title="Love me ?"

android:defaultValue="false" />

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

普通话

粤语

英语

俄语

法语

mandarin

cantonese

en_us

russian

french

love_me

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//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)

android:icon="@drawable/ic_launcher"

android:title="Settings"

android:summary="真球忙">

android:icon="@drawable/ic_launcher"

android:title="Settings"

android:summary="真球忙">

android:fragment="com.aHRNESaHqng.demo.ui.fragment.PreferenceFragmentTest"

android:title="PreferenceFragmentTest">

android:fragment="com.aHRNESaHqng.demo.ui.fragment.PreferenceFragmentTest"

android:title="PreferenceFragmentTest">

android:icon="@mipmap/ic_launcher"

android:summary="view baidu website"

android:title="baidu">

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

android:icon="@mipmap/ic_launcher"

android:summary="view baidu website"

android:title="baidu">

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

android:action="android.intent.action.VIEW"

android:data="https://m.baidu.com/" />

注意:header各个属性的功能作用;

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

public clahttp://ss ListFragmentSettings extends ListFragment {

protected ArrayAdapter mAdapter;

protected String mData[];

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mData = getActivity().getResources().getStringArray(R.array.contries);

mAdapter = new ArrayAdapter(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/目录下)

android:key="mylocation"

android:summary="我的位置源"

android:title="我的位置">

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="mylocation"

android:summary="我的位置源"

android:title="我的位置">

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="wireless_network"

android:title="使用GPS"

android:summary="使用Gps查看应用的位置"

/>

android:key="mymsg"

android:summary="个人信息s"

android:title="个人信息">

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

android:key="mymsg"

android:summary="个人信息s"

android:title="个人信息">

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

android:key="myname"

android:title="请输入真实姓名"

android:summary="姓名"/>

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

public class PreferenceActivityTest extends PreferenceActivity {

private static List fragments = new ArrayList();

@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

target) {

loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Phttp://reference选项

fragments.clear();

for (Header header : target) {

fragments.add(header.fragment);

}

}

//android 4.3以上版本需要做验证,验证方式有很多 https://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的问题;

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring源码之请求路径匹配路由方式
下一篇:使用Spring AntPathMatcher的doMatch方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~