帐户首选项在ListPreference上崩溃

时间:2010-05-14 22:34:37

标签: android

我使用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的自定义子类中遇到了同样的错误。

5 个答案:

答案 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;同步设置上下文和类加载器找不到我的类。

我在这里看到两个解决方案:

  1. 将标志设置为意图。
  2. 子类首选项和处理onClick()以启动您的活动。但是如何发表我自己的课程?

答案 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"