2014-01-20 119 views
1

鑑於我res/xml/preferences.xml看起來是這樣的:ListPreference崩潰滾動時

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orderingFromXml="true"> 
    ... 
    <PreferenceCategory android:title="@string/reminders"> 
     <ListPreference 
       android:key="PREF_BATTERY_LOW" 
       android:title="@string/battery_low" 
       android:summary="@string/battery_low_desc" 
       android:entries="@array/battery_strings" 
       android:entryValues="@array/battery_values" 
       android:dialogTitle="@string/battery_low" 
       android:defaultValue="25" 
       /> 
    </PreferenceCategory> 
    ... 
</PreferenceScreen> 

我激活一個SettingsActivity類這些首選項是這樣的:

import android.preference.PreferenceActivity; 

public class SettingsActivity extends PreferenceActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

的src/main/RES /價值/陣列。 XML是這樣的:

<string-array name="battery_values"> 
    <item>5</item> 
    <item>10</item> 
    <item>15</item> 
    <item>20</item> 
    <item>25</item> 
    <item>30</item> 
    <item>40</item> 
    <item>50</item> 
</string-array> 

<string-array name="battery_strings"> 
    <item>5 %</item> 
    <item>10 %</item> 
    <item>15 %</item> 
    <item>20 %</item> 
    <item>25 %</item> 
    <item>30 %</item> 
    <item>40 %</item> 
    <item>50 %</item> 
</string-array> 

,當我使用SettingsActivity中,應用程序在打開頁面時會一直崩潰。堆棧跟蹤看起來是這樣的:

E/InputEventReceiver(28227): Exception dispatching input event. 
D/AndroidRuntime(28227): Shutting down VM 
W/dalvikvm(28227): threadid=1: thread exiting with uncaught exception (group=0xa613b908) 
I/AndroidRuntime(28227): VM exiting with result code 99, cleanup skipped. 
I/ActivityManager( 432): Process com.company.app (pid 28227) has died. 
D/dalvikvm(28249): Late-enabling CheckJNI 
W/ActivityManager( 432): Scheduling restart of crashed service com.company.app/.services.LocationService in 5000ms 
W/ActivityManager( 432): Force removing ActivityRecord{a6bfe408 u0 com.company.app/.SettingsActivity}: app died, no saved state 
I/WindowState( 432): WIN DEATH: Window{a6cb7078 u0 com.company.app/com.company.app.main.MainActivity} 
I/WindowState( 432): WIN DEATH: Window{a6cfea00 u0 com.company.app/com.company.app.SettingsActivity} 
I/ActivityManager( 432): Start proc com.company.app for activity com.company.app/.main.MainActivity: pid=28249 uid=10064 gids={50064, 3003, 1028} 
D/Zygote ( 160): Process 28227 exited cleanly (99) 
E/Trace (28249): error opening trace file: No such file or directory (2) 
E/jdwp (28249): Failed sending reply to debugger: Broken pipe 
D/dalvikvm(28249): Debugger has detached; object registry had 1 entries 
D/dalvikvm(28249): GC_FOR_ALLOC freed 126K, 2% free 8781K/8960K, paused 3ms, total 3ms 
D/libEGL (28249): loaded /system/lib/egl/libEGL_emulation.so 
D/  (28249): HostConnection::get() New Host Connection established 0xb78b4fd8, tid 28249 
D/libEGL (28249): loaded /system/lib/egl/libGLESv1_CM_emulation.so 
D/libEGL (28249): loaded /system/lib/egl/libGLESv2_emulation.so 
W/EGL_emulation(28249): eglSurfaceAttrib not implemented 
D/OpenGLRenderer(28249): Enabling debug mode 0 

沒有進一步的堆棧跟蹤或任何其他有用的日誌信息。 我一直在努力,以消除啓動偏好(工程,但沒有用),更改其類型(不支持)更改密鑰&字符串類型,刪除屬性,但應用程序仍然崩潰。

往上幾行我在使用其他ListPreference效果很好,僅這一個產生麻煩。我在這裏錯過了什麼?

+0

應該有更多的堆棧跟蹤......如果你選擇的logcat錯誤日誌類型,它表現出更多? – gunar

+0

日誌從通過「亞行logcat」命令行來了。 –

+0

的XML的根是不是'PreferenceCategory'任何機會?應該是'PreferenceScreen'。 – ozbek

回答

1

感謝@shoerat指出在上面的代碼中沒有出現問題以及缺少堆棧跟蹤我想知道這是否是一些內部異常被捕獲但沒有發送「up」。調試這一次是(Android Studio中)的一個好辦法:

  • 打開運行>查看斷點...
  • 啓用例外斷點>的任何異常break point configuration
  • 查找的java.util.Formatter。 checkFlags拋出一個異常FormatFlagsConversionMismatchException這是不可見的任何地方
  • 跟蹤它到ListPreference.getSummary:

    @Override 
    public CharSequence getSummary() { 
        final CharSequence entry = getEntry(); 
        if (mSummary == null || entry == null) { 
         return super.getSummary(); 
        } else { 
         return String.format(mSummary, entry); 
        } 
    } 
    
  • 檢查摘要格式字符串並發現它具有非法內容(單個%而不是%%)

  • 將格式字符串更改爲包含%%或%s(以包含當前值)。