鉴于我的 res/xml/preferences.xml
看起来像这样:
<?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/values/array.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,它运行良好,只是这一个会造成麻烦。我在这里遗漏了什么吗?
最佳答案
感谢@shoerat 指出上面的代码没有明显的问题而且缺少堆栈跟踪我想知道这是否是某个内部异常被捕获但没有被“向上”发送。调试这个的一个好方法是(在 Android Studio 中):
- 打开运行 > 查看断点...
- 启用异常断点> 任何异常
- 发现 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(以包含当前值)。
关于android - 滚动时 ListPreference 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238668/