我使用AccountAuthenticator创建了一个帐户类型,如SampleSyncAdapter
教程中所做的那样。我现在正试图让帐户偏好工作。
我已将android:accountPreferences="@xml/account_preferences"
行添加到我的account-authenticator
,而account_preferences.xml就是这样:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/alum_settings_title"/>
<CheckBoxPreference
android:key="sync_alum"
android:title="@string/sync_alum"
android:summaryOn="@string/sync_alum_check"
android:summaryOff="@string/sync_alum_nocheck"/>
<ListPreference
android:key="sync_alum_since"
android:title="@string/alum_years"
android:entries="@array/years"
android:entryValues="@array/years"
android:dependency="sync_alum"/>
</PreferenceScreen>
复选框首选项的工作方式与它应该完全相同,但ListPreference会使用以下消息使整个系统崩溃:
05-14 22:32:16.794: ERROR/AndroidRuntime(63): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
我在EditTextPreference和我创建的DialogPreference的自定义子类中遇到了同样的错误。
答案 0 :(得分:6)
我终于成功启动了自定义偏好设置活动。陷阱是你必须保持以下XML布局(如上所述):
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Account settings" />
<PreferenceScreen
android:key="key"
android:title="General settings"
android:summary="Some summary">
<!-- package relative class name-->
<intent
android:action="my.account.preference.MAIN"
android:targetClass="prefs.AccountPreferencesActivity.class">
</intent>
</PreferenceScreen>
</PreferenceScreen>
根据AndroidManifest.xml条目:
<activity
android:label="Account preferences"
android:name=".prefs.AccountPreferencesActivity">
<intent-filter>
<action
android:name="my.account.preference.MAIN" />
<category
android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
如果您查看Android code,可以找到以下代码行:
private void updatePreferenceIntents(PreferenceScreen prefs) {
for (int i = 0; i < prefs.getPreferenceCount(); i++) {
Intent intent = prefs.getPreference(i).getIntent();
if (intent != null) {
intent.putExtra(ACCOUNT_KEY, mAccount);
// This is somewhat of a hack. Since the preference screen we're accessing comes
// from another package, we need to modify the intent to launch it with
// FLAG_ACTIVITY_NEW_TASK.
// TODO: Do something smarter if we ever have PreferenceScreens of our own.
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
}
}
}
并将这些标志添加到XML中指定的Intent。但这仅适用于PreferenceScreen的所有一年级儿童。我的错是我在PreferenceCategory中封装了我的Intent,因此该标志从未被OR-ed。
希望我能提供帮助。
答案 1 :(得分:1)
我遇到了同样的问题并遇到了上面提到的相同的例外情况。在查看Android源代码之后,似乎每个想要创建对话框或新窗口的首选项都会出现这种情况。这似乎被创建为APPLICATION_WINDOW出了什么问题。
在AbstractAccountAuthenticator的文档中,该示例使用了点击意图。
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/title_fmt" />
<PreferenceScreen
android:key="key1"
android:title="@string/key1_action"
android:summary="@string/key1_summary">
<intent
android:action="key1.ACTION"
android:targetPackage="key1.package"
android:targetClass="key1.class" />
</PreferenceScreen>
我认为目的是从帐户首选项中启动新的首选项活动,而不是使用它们。不好的是,这会弹出一个新的例外:
10-01 09:33:36.935: ERROR/AndroidRuntime(52): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
最大的问题是如何赋予意图标志?我没见过用XML设置intent标志的方法。我已经创建了自己的首选项并在onClick()期间启动了intent。但似乎帐户首选项已在帐户&amp;同步设置上下文和类加载器找不到我的类。
我在这里看到两个解决方案:
答案 2 :(得分:0)
是的,这似乎是一个错误。谷歌有一些错误。
我可以使用“编辑”和“列表”首选项确认相同的问题。到目前为止,我只能让CheckBox工作而不会崩溃。状态是持久的,但我不知道状态存储在哪里。
答案 3 :(得分:-1)
对于笑脸,试试你的PreferenceCategory
。无论如何,它并没有给你带来太多好处,因为它并没有包含任何偏好。我怀疑这是你的问题,但这是我用XML看到的唯一奇怪的东西。
否则,该异常会对我产生“Android错误”,因此如果您可以创建一个再现错误的项目,请将其发布到http://b.android.com。
答案 4 :(得分:-1)
也许是因为你使用相同的阵列?将entries
作为entryValues
?
尝试制作另一个阵列并尝试
android:entries="@array/years"
android:entryValues="@array/years_values"