篆体字作品 | 篆体字知识 | 加入收藏 篆体字转换器软件可转换多种篆体字在线预览 网页版 V2.0
篆体字转换器

当前位置:篆体字网 > 知识库 >

preferenceactivity

时间:2024-01-01 14:53:21 编辑:篆字君 来源:篆体字网

(1)如果你的App支持Android3.0以前,你必须创建一个PreferenceActivity类的子类。
(2)在Android3.0以后,你应该使用一个传统的Activity,并包含一个PreferenceFragment。然而你还是可以使用PreferenceActivity,在你有多组设置时,可以为大屏幕创建一个Two-panel layout。
一、Preferences类作为所有Setting的抽象父类。其每个子类都包括一组属性允许你指定其title(标题)、默认值等。每个子类还提供了其自己的特定的属性和用户界面。一些常用的Preference有:
(1)CheckboxPreference
(2)ListPreference:
(3)EditTextPreference:
当然,内建的类不可能满足你所有的需求,例如,平台当前没有提供一个选择数字或日期的Preference类。所以你可以自己子类化一个Preference。
二、创建自定义的Preference
(感觉系统说的太繁琐,自己总结一些简单的吧)
继承DialogPreference
class MyPreference extends DialogPreference {
private Context mContext;
public MyPreference (Context context, AttributeSet attrs) {
super(context, attrs);
mContext=context;
setDialogTitle("MyTitle");
setDialogMessage("MyMessage");
setTitle("MyTitle");
setSummary("MySummory");
//可选
setDialogLayoutResource(R.layout.xxx);//指定dialog布局资源,如果不单单是显示,要对资源操作的话,就不要用这个了,实现onClick接口弹出自己的AlertDialog更好一些
setPositiveButtonText(android.R.string.ok);//同上
setNegativeButtonText(android.R.string.cancel);//同上
setDialogIcon(null);//同上
}
@Override
protected void onClick() {
//如果覆盖了此函数,系统就不会弹出预定义的AlertDialog,你可以在用户点击后做任何操作
}
ProgressDialog mProgressDialog=null;
private Handler mhandler=new Handler(Looper.getMainLooper());
private Runnable myTask=new Runnable() {
@Override
public void run() {
mhandler.post(new Runnable() {
@Override
public void run() {
mProgressDialog.setTitle("xxx,请稍后.....");
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}
});
//一些后台操作
mhandler.post(new Runnable() {
@Override
public void run() {
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
//一些其他UI操作
}
});
}
};
// 关闭对话框
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
//可选
persistInt(mNewValue);//系统提供的存储Preference的便捷函数,其实可以自己写,也不是很麻烦,而且易于控制
try {
if (mProgressDialog==null) {
mProgressDialog=new ProgressDialog(mContext);
}
new Thread(correnctDataTask).start();
} catch (Exception e) {
//异常出现时操作
}
}
}
}
三、使用代码创建PreferenceActivity内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setPreferenceScreen(createPreferenceHierarchy());
initialUI();
}
private PreferenceScreen createPreferenceHierarchy() {
// 创建Root
PreferenceScreen root=getPreferenceManager().createPreferenceScreen(this);
// 创建基本设置Category
PreferenceCategory baseCategory=new PreferenceCategory(this);
baseCategory.setTitle("基本设置");
root.addPreference(baseCategory);
PreferenceCategory userInfoCategory=new PreferenceCategory(this);
userInfoCategory.setTitle("用户设置");
root.addPreference(userInfoCategory);
// 创建自己的preference并添加到category中
Preference somePreferenece=new CheckBoxPreference(this);
userInfoCategory.addPreference(somePreferenece );
return root;
}
private void initialUI() {
// 是否使用卫星定位设置
someCheckBoxPreferenece .setTitle("MyTtitle");
someCheckBoxPreferenece.setKey("somekey");
someCheckBoxPreferenece.setSummaryOn("summaryOn");
someCheckBoxPreferenece.setSummaryOff("summoryOff");
someCheckBoxPreferenece.setChecked(somePreferenceValue);
someCheckBoxPreferenece.setEnabled(true);
}
//可选,如果你的PreferenceActivity需要监听Preference变化来刷新界面,则注册监听接口,一般不用
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
四、在XML中定义Preference:
你可以在运行时实例化Preference,但官方建议应该在XML中定义。【但个人觉得使用代码还是很方便,尤其可以加入自己实现的Preference子类,对XML无感的可以略过下面内容】。
可以使用诸如元素标签。必须存储XML文件在res/xml文件夹中。虽然你可以任意命名该文件,但是一般将其命名为preferences.xml。你通常只需要一个文件。
【注意:如果你想创建一个multi-panel layout,你需要将每个Fragment的XML文件分开。】
XML文件的根节点必须是一个元素。在这个元素内添加各种
例子:


android:key="pref_sync"
android:title="@string/pref_sync"
android:summary="@string/pref_sync_summ"
android:defaultValue="true" />
android:dependency="pref_sync"
android:key="pref_syncConnectionType"
android:title="@string/pref_syncConnectionType"
android:dialogTitle="@string/pref_syncConnectionType"
android:entries="@array/pref_syncConnectionTypes_entries"
android:entryValues="@array/pref_syncConnectionTypes_values"
android:defaultValue="@string/pref_syncConnectionTypes_default" />

在这个例子中,有一个CheckBoxPreference和一个ListPreference。它们都包括如下属性:
android:key : 指定保存键值对时的键。需要唯一。唯一不需要此属性的是PreferenceCategory或PreferenceScreen,或者Preference指定了一个Intent来调用(使用元素)或一个Fragment来显示(使用android:fragment属性)
android:title: 指定Setting的用户看见的名称。
android:defaultValue: 指定默认设置到Preferences文件的值。
五、创建Setting Groups:
可以使用两种方式:
(1) 使用Titles:
在XML中使用对各种进行分组。例如
android:title="@string/pref_sms_storage_title"
android:key="pref_key_storage_settings">
android:key="pref_key_auto_delete"
android:summary="@string/pref_summary_auto_delete"
android:title="@string/pref_title_auto_delete"
android:defaultValue="false"... />
android:key="pref_key_sms_delete_limit"
android:dependency="pref_key_auto_delete"
android:summary="@string/pref_summary_delete_limit"
android:title="@string/pref_title_sms_delete"... />
android:key="pref_key_mms_delete_limit"
android:dependency="pref_key_auto_delete"
android:summary="@string/pref_summary_delete_limit"
android:title="@string/pref_title_mms_delete" ... />

(2)使用subscreens:
如果你想放置一组Settings到第二个屏幕,可以使用对各种进行分组。例子:


android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />

android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...

android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...

...

六、使用Intents:
有时,你想让一个Preference项打开另一个Activity,而不是一个setting screen。使用元素作为元素的子元素。
例如:

android:data="http://www.example.com" />

你可以使用如下属性创建显式或隐式的Intent:
(1)android:action :等于setAction()。
(2)android:data: 等于setData()。
(3)android:mimeType: 等于setType()。
(4)android:targetClass: 组件名称的类部分,等于setComponent()的一部分。
(5)android:targetPackage : 组件名称的包部分,等于 setComponent()的一部分。
七、创建一个PreferenceActivity
要在Activity中显示你的Settings,需要继承PreferenceActivity类。这是一个传统Activity类的扩展,显示一列Preference对象的Settings。PreferenceActivity在用户做出更改时,自动持久化每个Preference相关的Settings。(如果你正在开发Android3.0以上的系统,你应该使用PreferenceFragment)
你应该谨记的最重要的事情是,不要在onCreate()方法中“加载”view视图的布局。取而代之的,你调用addPreferenceFromResource()来添加你在XML中声明的Preference到Activity中。例如:
public class SettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
八、使用Preference Fragments
Android3.0以后,建议使用PreferenceFragment。然后将其添加到Activity,所以不需要使用PreferenceActivity。
PreferenceFragment的实现和PreferenceActivity的实现差不多,例如:
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
...
}
然后将其添加到Activity
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
九、设置默认值
首先在XML中设置android:defaultValue属性。然后在应用程序启动的第一个Activity中的onCreate()方法中调用:
PreferenceManager.setDefaultValues(this,R.xml.advanced_preferences,false);
来设置默认值。
十、使用Preference Header
在一些很少的场合,你可能想设计你的Settings为 第一个屏幕只显示一系列subscreen(例如系统设置app)。当你在Android3.0以上开发这样的设计时,你应该使用一个新的“header特色,来替代 使用内嵌的PreferenceScreen元素来创建subScreen。
要使用Headers,你需要:
(1)分离每个Group到单独的PreferenceFragment的实例中。就是一组Settings需要一个单独的XML文件。
(2)创建一个XML Header文件,列出每个Setting Group,并声明哪个Fragment包含哪个相应的Setting List。
(3)继承PreferenceActivity来host 你的Settings
(4)实现onBuildHeaders()回调来指定Header File。
这样做最大的好处是PreferenceActivity自动显示一个two-pane layout。
十一、创建Header File
例子:


android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentOne"
android:title="@string/prefs_category_one"
android:summary="@string/prefs_summ_category_one" />
android:fragment="com.example.prefs.SettingsActivity$SettingsFragmentTwo"
android:title="@string/prefs_category_two"
android:summary="@string/prefs_summ_category_two" >




元素允许你传递键值对Bundle给Fragment,通过getArguments()获得。使用这个Bundle的主要作用是重用相同的PreferenceFragment子类,根据不同的键值对,显示不同的XML文件。
十二、显示Headers
例子:
public class SettingsActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List

target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
}
当使用Preference Headers时,不需要实现onCreate()方法,因为其唯一的任务只是加载Headers
十一、监听Preference Changes
实现SharedPreference.OnSharePreferenceChangeListener接口,并为SharedPreference对象注册listener,通过 registerOnSharedPreferenceChangeListener()。
该接口只有一个回调方法,onSharedPreferenceChanged(),
例子:
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
public static final String KEY_PREF_SYNC_CONN="pref_syncConnectionType";
...
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(KEY_PREF_SYNC_CONN)) {
Preference connectionPref=findPreference(key);
// Set summary to be the user-description for the selected value
connectionPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
推荐在onResume时注册,在onPause()时取消注册。
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
十三、管理网络用量
从Android4.0以后,系统设置应用程序允许用户查看他们的应用在前台和后台使用了多少网络数据。用户可以禁用每个应用在后台使用网络数据。为了避免用户禁用你的应用在后台访问网络,你应该更效率的使用网络,并且允许用户通过你的应用的Settings来改善数据用量。
例如,你或许允许用户控制你的应用同步数据的频率,是否你的app只在wifi下上传下载数据,是否在漫游时访问网络等。
当你添加了必要的Preference到你的PreferenceActivity中来控制你的app的数据访问习惯,你应该添加一个Intent filter给你的PreferenceActivity。例子:






这个Intent-filter告诉系统 这个Activity是控制你的应用程序的数据用量的Activity。因此,当用户从系统设置应用程序中查询你的应用使用了多少数据时,一个查看”应用程序设置“的按钮就可以加载你的PreferenceActivity,用户也就可以改善你的应用应该如何使用数据。

Copyright:2021-2023 篆体字转换器 www.dddtedu.com All rights reserved.