简体   繁体   English

来自 XML 首选项的 UnknownFormatConversionException(仅在一加一上)

[英]UnknownFormatConversionException coming from XML preferences (only on Oneplus One)

I'm getting following exception when trying to display ListPreference in a PreferenceFragment .尝试在PreferenceFragment显示ListPreference时出现以下异常。

Note that this happens only on Oneplus One device.请注意,这仅发生在一加一设备上。 I've tried the same on Nexus 4, Moto G and S5 without any issues.我在 Nexus 4、Moto G 和 S5 上尝试过同样的方法,没有任何问题。

Stack trace:堆栈跟踪:

09-08 14:33:50.434  20107-20107/com.callsign.ferret E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.callsign.ferret, PID: 20107
java.util.UnknownFormatConversionException: Conversion:
        at java.util.Formatter$FormatSpecifierParser.unknownFormatConversionException(Formatter.java:2321)
        at java.util.Formatter$FormatSpecifierParser.advance(Formatter.java:2315)
        at java.util.Formatter$FormatSpecifierParser.parseConversionType(Formatter.java:2394)
        at java.util.Formatter$FormatSpecifierParser.parseArgumentIndexAndFlags(Formatter.java:2365)
        at java.util.Formatter$FormatSpecifierParser.parseFormatToken(Formatter.java:2298)
        at java.util.Formatter.doFormat(Formatter.java:1071)
        at java.util.Formatter.format(Formatter.java:1042)
        at java.util.Formatter.format(Formatter.java:1011)
        at java.lang.String.format(String.java:1803)
        at java.lang.String.format(String.java:1777)
        at android.preference.ListPreference.getSummary(ListPreference.java:168)
        at android.preference.Preference.onBindView(Preference.java:550)
        at android.preference.Preference.getView(Preference.java:489)
        at android.preference.PreferenceGroupAdapter.getView(PreferenceGroupAdapter.java:246)
        at android.widget.AbsListView.obtainView(AbsListView.java:2349)
        at android.widget.ListView.makeAndAddView(ListView.java:1864)
        at android.widget.ListView.fillDown(ListView.java:698)
        at android.widget.ListView.fillGap(ListView.java:662)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5007)
        at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3424)
        at android.widget.AbsListView.onTouchMove(AbsListView.java:3807)
        at android.widget.AbsListView.onTouchEvent(AbsListView.java:3638)
        at android.view.View.dispatchTouchEvent(View.java:8472)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
        at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)
        at android.view.View.dispatchPointerEvent(View.java:8667)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImp

preferences.xml loaded to my PreferenceFragment : references.xml 加载到我的PreferenceFragment

<ListPreference
        android:key="@string/pref_key_app_orientation_frequency"
        android:title="@string/pref_app_orientation_frequency"
        android:enabled="false"
        android:entryValues="@array/pref_orientation_frequency_values"
        android:entries="@array/pref_orientation_frequency"/>

arrays.xml containing above referenced arrays: arrays.xml 包含上面引用的数组:

<string-array name="pref_orientation_frequency_values">
    <item>100</item>
    <item>50</item>
    <item>25</item>
    <item>10</item>
</string-array>

<string-array name="pref_orientation_frequency">
    <item>@string/percent_100</item>
    <item>@string/percent_50</item>
    <item>@string/percent_25</item>
    <item>@string/percent_10</item>
</string-array>

strings.xml containing above referenced strings: strings.xml 包含上面引用的字符串:

<string name="percent_100">100%</string>
<string name="percent_50">50%</string>
<string name="percent_25">25%</string>
<string name="percent_10">10%</string>

I first thought it was related to the percentage symbol, but removing it didn't solve the issue.我首先认为它与百分比符号有关,但删除它并没有解决问题。 I can't see any hint in the stack trace and this issue seems to be device specific.我在堆栈跟踪中看不到任何提示,这个问题似乎是特定于设备的。

I had the same exception, but in a Galaxy S5.我有同样的例外,但在 Galaxy S5 中。 I solved using '%%' instead of '%' in strings.xml.我解决了在strings.xml 中使用'%%' 而不是'%' 的问题。

<string name="percent_100">100%%</string>
<string name="percent_50">50%%</string>
<string name="percent_25">25%%</string>
<string name="percent_10">10%%</string>

regards问候

Using %% will cause exceptions on some Android versions, different solutions exist as explained here , most of them quite complicated for such a simple task.使用%%会在某些 Android 版本上导致异常, 这里解释不同的解决方案,其中大多数对于这样一个简单的任务来说相当复杂。

I decided to avoid the problem by using the unicode of a smaller version of the percentage character:我决定通过使用较小版本的百分比字符的 unicode 来避免这个问题:

&#65130;

Maybe your problem is with summary definition (see log at android.preference.ListPreference.getSummary(ListPreference.java:168) Do you define summary somewhere in code?也许您的问题与摘要定义有关(请参阅 android.preference.ListPreference.getSummary(ListPreference.java:168) 上的日志)您是否在代码中的某处定义了摘要?

I had a similar problem when I defined summary as "21 %" in xml(just for testing):当我在 xml 中将摘要定义为“21%”(仅用于测试)时,我遇到了类似的问题:

<ListPreference
...
app:summary="@string/percentage(value 21%)"
/>

this worked well:这很有效:

<ListPreference
...
app:summary="@string/percentage(value 21%%)"
/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM