在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
1111
2022-12-10
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文件中新建以上需要的资源数据 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/ 四,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 protected String mData[]; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mData = getActivity().getResources().getStringArray(R.array.contries); mAdapter = new ArrayAdapter 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 @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 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文件中新建以上需要的资源数据 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/ 四,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 protected String mData[]; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mData = getActivity().getResources().getStringArray(R.array.contries); mAdapter = new ArrayAdapter 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 @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 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文件中新建以上需要的资源数据 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/ 四,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 protected String mData[]; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mData = getActivity().getResources().getStringArray(R.array.contries); mAdapter = new ArrayAdapter 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 @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 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文件中新建以上需要的资源数据
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/
四,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
protected String mData[];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getActivity().getResources().getStringArray(R.array.contries);
mAdapter = new ArrayAdapter
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
@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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~