2010-05-14 61 views
4

我使用AccountAuthenticator的東西創建了一個帳戶類型,如在SampleSyncAdapter教程中所做的那樣。我現在試圖獲取帳戶首選項的工作。帳戶偏好在ListPreference上崩潰

我添加了這行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

PS。這是整個堆棧跟蹤。我沒有把它放在原來的文章中,試圖保持可讀性。 http://gist.github.com/raw/401785/73141d95ebddab0fc67b6219c38701c8d3ac7051/gistfile1.txt – Sionide21 2010-05-14 22:36:44

回答

-1

對於咧嘴笑,試試看你的PreferenceCategory。無論如何,它並沒有讓你變得很好,因爲它沒有包含任何偏好。我懷疑這是你的問題,但這是我看到的唯一奇怪的事情。

否則,該異常將「Android bug」掃描給我,因此如果您可以創建重現錯誤的項目,請將其發佈並將其發送到http://b.android.com

+0

刪除該類別標記沒有改變任何東西。在提交bug之前,我會再多一點。 – Sionide21 2010-05-15 18:39:00

+0

好吧,我認爲這是一個錯誤,因爲當我創建一個'PreferenceActivity'並使用'addPreferencesFromResource'指向同一個xml文件時,它工作得很好。 – Sionide21 2010-05-16 04:04:24

+0

這可能是Android團隊的一個錯誤或糟糕的設計選擇。但說它不能自己解決問題。 – petersaints 2013-06-17 03:04:52

-1

也許是因爲你使用了相同的數組?爲您的entries作爲您的entryValues

嘗試使另一個數組,並試圖

android:entries="@array/years" 
android:entryValues="@array/years_values" 
0

是這似乎是一個錯誤。 Google有一些錯誤。

我可以用編輯和列表首選項確認相同的問題。到目前爲止,我只能使CheckBox工作而不會崩潰。這個狀態是持久的,但我不知道狀態的存儲位置。

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設置意圖標誌的方法。我已經創建了自己的偏好,並在onClick()期間啓動了這個意圖。但似乎帳戶首選項是在&同步設置上下文中啓動的,而類加載器無法找到我的類。

我在這裏看到的兩個解決方案:

  1. 設置標誌的意圖。
  2. 子類首選項並處理onClick()以啓動您的活動。但是如何發佈我自己的課程?
+0

對於'AndroidRuntimeException',看看這個:http://stackoverflow.com/questions/14328253/launch-intent-from-account-authenticator-accountpreferences-screen – 2013-02-21 14:00:00

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中指定的意圖。但這隻適用於PreferenceScreen的所有1年級的孩子。我的錯是我將Intent封裝在PreferenceCategory中,所以這個標誌從來沒有OR-ed。

希望我能幫上忙。

+0

在Android清單中,您可以將多個操作和類別對於同一Activity 標記,並且此帳戶首選項活動將從android; s設置帳戶屏幕啓動,可能還會在工具欄上以及可能在其他位置定義多個操作的應用程序設置中啓動。關鍵是這個帳戶首選項實施不止一次。 – Pomagranite 2016-07-24 22:58:35