GVKun编程网logo

preference的使用(preference怎么用)

19

在这篇文章中,我们将为您详细介绍preference的使用的内容,并且讨论关于preference怎么用的相关问题。此外,我们还会涉及一些关于AndroidQ中不推荐使用PreferenceManag

在这篇文章中,我们将为您详细介绍preference的使用的内容,并且讨论关于preference怎么用的相关问题。此外,我们还会涉及一些关于Android Q 中不推荐使用 PreferenceManager getDefaultSharedPreferences、android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()、android – 从PreferenceScreen转到DialogPreference、android – 使用PreferenceActivity和PreferenceFragment而不创建层次结构的知识,以帮助您更全面地了解这个主题。

本文目录一览:

preference的使用(preference怎么用)

preference的使用(preference怎么用)

Preference直译为偏好,博友建议翻译为首选项。一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依然有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,同时Android提供一种类似的layout的方式来进行Prefernce的布局。

一个简单的Preferenece例子

步骤1:编写preference XML,在res/xml/下加入我们的preference XML文件,例如名字叫c21preference.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- preference的组织方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是带层次组织关系,在后面的例子体验,而PreferenceScreen就是最平白和基础的方式 -->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 有四个基本组建,这个例子学习两个。里面的内容对照图,很容易理解,RingtonePreference是选择铃音,这里给出两个选择,系统默认的铃音和无声 -->
<CheckBoxPreference android:key="
checkbox"
android:title="
CheckBox Preference"
android:summary="
Check it on , check it off"/>
<RingtonePreference android:key="
ringtone"
android:title="
Ringtone Preference"
android:showDefault="
true"
android:showSilent="
true"
android:summary="
Pick a tone, any tone"/>
< /PreferenceScreen>

步骤2:在java源代码中调用该xml,生成相应的preference界面

public class Chapter21Test1 extendsPreferenceActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.c21preference);
}
}

和用layout方式一样,代码很简单。和以往界面最大的区别是,我们对checkbox进行选择或者对ringtone进行选择后,这个选择结果是被保留的,当我们退出actitvity后再次进入,上次的选项依然保留,我们重新向模拟器load应用,发现之前的选项仍然存在。我们可以利用preference,而无须人工对数据进行保存和读取,很是方便。

步骤3:获取preference的数据

处了在preference的界面中可以保留数据,我们也希望能够读出数据,以便这些数据可以用在其他的activity中。如果另一个activity和这些数据关联,而且希望能够实时进行同步,在onResume()中对preference保留的数据进行读取,而后进行相关的更新。

首先要获取preferences,然后通过键值对的获取方式根据key获取数值,在xml中checkbox的key为“checkbox”,值的类型为布尔值,而rintong的值为String,例如:

protected void onResume() { //在另一个Activity中
super.onResume();
SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
System.out.println(new Boolean(prefs.getBoolean("
checkbox",false)).toString());//false表示没有查到checkbox这个key的返回值
System.out.println(prefs.getString("
ringtone","<unset>"));//<unset>表示没有查到ringtong这个key的返回值
}

获取preferences可以通过三种方式:
一、getPreferences():可以获取同一activity中的preference;
二、getSharedPreferences():可以获取映用级别的preferences(),在这个例子中由于我们封装在同一app中,也可以使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);其中第一个参数name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我们例子的方式,通过Android的偏好管理器来获取其所管理的preferences。

Preferenece数据的操作

在上面的例子中,preference的数值会被保留,而且可以在其他的activity中读取。如果需要清除数据,可以通过remove()清除某个名字的prefernece,clear()清除所有的preferences。我们可以通过edit()获取preferences的editor,进而进行编辑,修改后,通过commit()将修改值保存。

Preferenece XML

Preference的XML可以通过PreferenceCategory来进行组织。PreferenceCategory可以将几个组建组合在一起,并加上标题。我们依然用前面的xml例子,通过PreferenceCategory来进行组织,如下:和之前的例子比较,将chekcbox和rintong组织成为一个category,并加上了"simple Preferences"的标题。

<?xml version="1.0" encoding="utf-8"?>
< PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Simple Preferences">
<CheckBoxPreference android:key="checkbox" ..../>
<RingtonePreference android:key="ringtone" ... />

</PreferenceCategory>
< /PreferenceScreen>

PreferenceCategory也可以嵌套PreferenceScreen,PreferenceScreen中的内容,将通过另一屏来显示,我们在上面例子后面添加一个嵌套了PreferenceScreen的PreferenceCategory。整个PreferenceScreen作为一个组件出现,点击后新的一屏,由入PreferenceScreen定义。通过这个关系,我们可以组织自己的preference架构。

<?xml version="1.0" encoding="utf-8"?>
< PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Simple Preferences">
<CheckBoxPreference android:key="checkbox" ..../>
<RingtonePreference android:key="ringtone" ... />
</PreferenceCategory>

<PreferenceCategory android:title="Detail Screens">
<PreferenceScreen android:title="Detail"
android:summary="Addtional preference help in another page">
<CheckBoxPreference
android:key="checkbox2"
android:title="Another Checkbox"
android:summary="On or Off, It''s a problem...."
/>
</PreferenceScreen>
</PreferenceCategory>
< /PreferenceScreen>

在前面的例子中我们使用了CheckBox和Ringtong,在下面的例子,我们实验另外的两个组建EditText和List,这两种都是已弹框的方式。在上面的例子我们继续增加内容

<?xml version="1.0" encoding="utf-8"?>
< PreferenceScreen ...>
......

<PreferenceCategory android:title="Other Preferences">
<EditTextPreference android:key="text"
android:title="
Text Entry Dialog"
android:summary="
Click to pop up a field for entry"
android:dialogTitle="
Enter something useful"/>
<ListPreference android:key="list"
android:title="
Selection Dialog"
android:summary="
Click to pop yo a list for select"
android:entries="@array/cities"
android:entryValues="@array/airport_codes"

android:dialogTitle="
Choose a City"/>
</PreferenceCategory>
</PreferenceScreen>

在list中由两个引用@array/cities和@array/airport_codes,我们在资源文件中定义此两array。内容如下:
<resource>
<string-array>
<item>Pittsburgh</item>
<item>Allentown/Bethlehem</item>
<item>Erie</item>
... ...
</string-array>
<string-array name="airport_codes">
<item>PHL</item>
<item>PIT</item>
<item>ABE</item>
... ...
</string-array>
< /resources>

运行结果如右图所示。对于EditText,键值对保存的值是String,即用户在输入框中输入的内容。List的情况稍微复杂一些,在设置ListPreference的属性有一个entires,这是在List显示给用户看的内容,如果我们去获取preference的值,在这个例子为prefs.getString("list", "<unset>");,则返回在entryValues对应的数值,例如我们选择了第一个item:Pittsburgh,则获取的值为PHL。entries和entryValues是一一对应的。

 

Android Q 中不推荐使用 PreferenceManager getDefaultSharedPreferences

Android Q 中不推荐使用 PreferenceManager getDefaultSharedPreferences

PreferenceManager getDefaultSharedPreferences在Android
10
中已弃用。我该如何更换它?

android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()

android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()

PreferenceManager.getDefaultSharedPreferences(context)

getPreferences()

似乎检索不同的首选项.

PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
                        "userWasAskedToEnableGps", false);

对我来说,返回false,

getPreferences(MODE_PRIVATE).getBoolean("userWasAskedToEnableGps", false);

返回true.

Preference是用编辑器编写的

Editor e = getPreferences(MODE_PRIVATE).edit(); 
e.putBoolean (...);
e.commit();

如何在Context中的Activity之外获得相同的Preferences?

解决方法:

从android github repo(1),我们可以看到getPreferences除了使用当前类名调用getSharedPreferences方法之外什么都不做.

public SharedPreferences getPreferences( int mode ) {
    return getSharedPreferences( getLocalClassName(), mode );
}

没有什么限制其他活动/代码使用适当的类名访问共享首选项.更重要的是,我不想使用getPreferences,因为这意味着=>永远不会更改活动名称.如果更改,则使用明确提及的早期类名称(升级前)来处理访问共享首选项.

android – 从PreferenceScreen转到DialogPreference

android – 从PreferenceScreen转到DialogPreference

我的应用程序有一个设置菜单,实际上是一个PreferenceActivity.
当它被创建时,如果未设置布尔值,我想转到设置它的DialogPreference.

我尝试使用intent但是应用程序强制关闭此错误消息:

E/AndroidRuntime( 239):
android.content.ActivityNotFoundException:
Unable to find explicit activity class
{com.xxxx/com.xxxx.xxxxPreference};
have you declared this activity in
your AndroidManifest.xml?

我该怎么做?可以将DialogPreference添加到清单中吗?

解决方法:

DialogPreference本身不是一个Activity.它只是一个在单击时显示对话框的首选项.

问题是没有明显的方式以编程方式单击首选项.但是,由于您使用的是DialogPreference,因此您已经拥有了自己的子类.所以我们可以通过在DialogPreference的子类中添加以下方法来解决我们的问题:

//Expose the protected onClick method
void show() {
    onClick();
}

然后在您的PreferencesActivity的onCreate()中,您将有类似的内容从XML文件加载首选项:

// Load the preferences from an XML resource
addPreferencesFromresource(R.xml.preferences);

之后你可以放一些像这样的代码:

booleanProp = true; //set this to the value of the property you're checking     

if (! booleanProp) {
    //Find the Preference via its android:key
    //MyDialogPreference is your subclasss of DialogPreference
    MyDialogPreference dp = (MyDialogPreference)getPreferenceScreen().findPreference("dialog_preference");  
    dp.show();
}

这是一个黑客攻击,因为暴露受保护的方法并不理想,但确实有效.

另一种选择是用PrefenceActivity替换Dialog,其中包含你想要维护的所有选项,然后你可以通过Intent启动它,但我假设你有一个很好的理由想要你自己的自定义Dialog具有特定的布局.如果您确实需要第二个PreferenceActivity,可以将其添加到首选项XML文件中,如下所示:

<PreferenceScreen
        android:title="@string/title_of_preference"
        android:summary="@string/summary_of_preference">
    <intent android:action="your.action.goes.HERE"/>
</PreferenceScreen>

android – 使用PreferenceActivity和PreferenceFragment而不创建层次结构

android – 使用PreferenceActivity和PreferenceFragment而不创建层次结构

似乎从 android开发人员文档中,他们提供了一个关于如何使用heiarchy和headers创建首选项的示例.

有没有办法在没有标题的情况下创建首选项?我看到有EXTRA_NO_HEADER,但我不太清楚如何使用它…

解决方法

当然,只需创建您的PreferenceActivity或~Fragment,具体取决于API级别/支持库的存在.本教程的开头就是您的问题: Settings @ Android Dev

关于preference的使用preference怎么用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Q 中不推荐使用 PreferenceManager getDefaultSharedPreferences、android – PreferenceManager.getDefaultSharedPreferences()vs getPreferences()、android – 从PreferenceScreen转到DialogPreference、android – 使用PreferenceActivity和PreferenceFragment而不创建层次结构等相关知识的信息别忘了在本站进行查找喔。

本文标签: