Сбой настроек учетной записи в ListPreference - PullRequest
4 голосов
/ 15 мая 2010

Я создал тип учетной записи, используя материал 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 ]

6 голосов
/ 01 октября 2010

Мне наконец-то удалось успешно запустить действие с пользовательскими настройками. Кульминацией было то, что вы должны сохранить следующую 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 , вы можете найти следующие строки кода:

    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. Но это работает только для всех детей 1-го класса PreferenceScreen. Моя ошибка заключалась в том, что я заключил свое намерение в категорию PreferenceCategory, поэтому флаг никогда не был ИЛИ.

Надеюсь, я смогу помочь.

1 голос
/ 01 октября 2010

У меня та же проблема, и я столкнулся с тем же исключением, упомянутым выше. После изучения источника 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. Я уже создал свое собственное предпочтение и запускаю намерение во время onClick (). Но похоже, что настройки учетной записи запускаются в контексте настроек учетной записи и синхронизации, и загрузчик классов не может найти мой класс.

Я вижу здесь два решения:

  1. Установите флажки для намерения.
  2. Настройка подкласса и обработка onClick () для запуска вашей деятельности. Но как опубликовать свой класс?
0 голосов
/ 26 августа 2010

Может быть, это потому, что вы используете один и тот же массив? для вашего entries как вашего entryValues?

попробуйте создать другой массив и попробуйте

android:entries="@array/years"
android:entryValues="@array/years_values"
0 голосов
/ 08 сентября 2010

Да, это похоже на ошибку. В Google есть некоторые ошибки против этого.

Я могу подтвердить ту же проблему с настройками Редактировать и Список. Пока я могу только заставить CheckBox работать без сбоев. Состояние является постоянным, но я не знаю, где оно хранится.

0 голосов
/ 15 мая 2010

Для ухмылки, попробуйте нанести ядерный заряд на PreferenceCategory. В любом случае, это не приносит вам пользы, так как не влияет на любые предпочтения. Я сомневаюсь, что это ваша проблема, но это единственное, что странно, я вижу в XML.

В противном случае это исключение вызывает у меня «ошибку Android», поэтому, если вы можете создать проект, воспроизводящий ошибку, опубликуйте его и эту информацию на http://b.android.com.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...