使用AppCompat、矢量图和4.1.2时出现奇怪的崩溃问题

4

当我尝试在Android v4.1.2 (API 16)上运行我的应用程序时,会出现一个非常奇怪的崩溃报告。在旧手机上会出现以下错误:

07-10 16:15:52.188 5496-5496/com.amplified.music.debug E/AndroidRuntime: FATAL EXCEPTION: main
      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.amplified.music.debug/com.amplified.music.activity.MainActivity}: android.view.InflateException: Binary XML file line #21: Error inflating class ImageButton
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
          at android.app.ActivityThread.access$700(ActivityThread.java:143)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
          at android.os.Handler.dispatchMessage(Handler.java:99)
          at android.os.Looper.loop(Looper.java:137)
          at android.app.ActivityThread.main(ActivityThread.java:4950)
          at java.lang.reflect.Method.invokeNative(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:511)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
          at dalvik.system.NativeStart.main(Native Method)
       Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class ImageButton
          at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
          at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
          at com.amplified.music.fragment.PlayerFragment.onCreateView(PlayerFragment.java:233)
          at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
          at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
          at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1332)
          at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2288)
          at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
          at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:356)
          at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
          at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
          at roboguice.activity.RoboFragmentActivity.onCreateView(RoboFragmentActivity.java:163)
          at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
          at android.view.LayoutInflater.parseInclude(LayoutInflater.java:830)
          at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
          at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
          at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:280)
          at com.amplified.music.activity.RoboAppCompatActivity.setContentView(RoboAppCompatActivity.java:55)
          at com.amplified.music.activity.MainActivity.onAuthenticatedCustomer(MainActivity.java:87)
          at com.amplified.music.activity.MusicActivity.onCreate(MusicActivity.java:72)
          at android.app.Activity.performCreate(Activity.java:5179)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
          at android.app.ActivityThread.access$700(ActivityThread.java:143) 
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241) 
          at android.os.Handler.dispatchMessage(Handler.java:99) 
          at android.os.Looper.loop(Looper.java:137) 
          at android.app.ActivityThread.main(ActivityThread.java:4950) 
          at java.lang.reflect.Method.invokeNative(Native Method) 
          at java.lang.reflect.Method.invoke(Method.java:511) 
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
          at dalvik.system.NativeStart.main(Native Method) 
       Caused by: java.lang.NumberFormatException: Invalid int: "res/color/abc_primary_text_material_dark.xml"
          at java.lang.Integer.invalidInt(Integer.java:138)
          at java.lang.Integer.parse(Integer.java:375)
          at java.lang.Integer.parseInt(Integer.java:366)
          at com.android.internal.util.XmlUtils.convertValueToInt(XmlUtils.java:123)
          at android.content.res.TypedArray.getInt(TypedArray.java:254)

我正在使用向量图,gradle构建文件中启用了vectorDrawables.useSupportLibrary = true设置。我使用以下代码引用我的图像:

<ImageButton android:id="@+id/playQueueButton"
        android:layout_marginRight="20dp"
        android:layout_marginEnd="20dp"
        android:layout_height="48dp"
        android:layout_width="48dp"
        style="@style/AppTheme.Button.Flat.Inverse"
        app:srcCompat="@drawable/ic_queue_music_black_24dp"/>

我的风格定义如下:

<style name="AppTheme.Button.Flat" parent="Widget.AppCompat.Button.Borderless">
    <item name="android:layout_margin">0dp</item>
    <item name="android:tint">?android:textColorPrimary</item>
    <item name="android:textColor">?android:textColorPrimary</item>
</style>

<style name="AppTheme.Button.Flat.Inverse" parent="AppTheme.Button.Flat">
    <item name="android:tint">?android:textColorPrimaryInverse</item>
    <item name="android:textColor">?android:textColorPrimaryInverse</item>
    <item name="android:background">@drawable/home_button_selector</item>
</style>

我在网上找不到有关这个错误的任何详细信息。 我不确定为什么会崩溃。


看起来根本原因是NumberFormatException。似乎Android在某些API版本上解析SVG时存在问题:https://dev59.com/nIbca4cB1Zd3GeqPSzek和https://code.google.com/p/android/issues/detail?id=202670。您能否查看SO帖子和Google代码问题中概述的解决方案是否有所帮助? - Dr. Nitpick
事实上,它在明显存在于App Compat样式内的某些东西方面遇到了麻烦。我没有包括的一件事是,我重构了之前没有继承自AppCompat样式的样式。那在API 16上运行良好。是的,这是一个NumberFormatException,但请注意它正在尝试解析什么。为什么SDK没有用正确的整数替换它呢?不过我确实知道答案。 - chubbsondubs
好的发现。感谢您提供的信息,并指出解析颜色资源时出错的好点子。 - Dr. Nitpick
3个回答

1
我遇到了类似的错误,看起来在一些旧系统中可能没有定义"?android:textColorPrimary"。
我的解决方案:
1. 在我的color.xml文件中定义textColorPrimary
2. 将"?android:textColorPrimary"更改为"@color/textColorPrimary"
无论是矢量图还是其他图像,在我的Android 4.2.2手机上都可以着色。

1

听起来这可能是问题的原因,但平台从未抱怨过使用它。通常,如果我尝试使用不受minSDK支持的API、属性等,Android Studio会抱怨。但在这种情况下,它从未抱怨过。 - chubbsondubs
如果您认为这是正确的答案,请接受它。 - Akshay

0

所以我一直没搞清楚为什么Android会抛出这个错误。毕竟SDK工具应该用R类中的正确整数替换@color引用。到底是怎么回事?

结果发现它不喜欢在样式中使用tint属性。如果移除了tint并用正确颜色的矢量图替换我的矢量图,哇,它就能正常工作了。所以很难确定tint在API 16上是否被支持,但听起来tint在API 16上部分地"支持",但并非完全支持。

之前我使用tint属性时是有效的,但它没有继承自AppCompat样式。只有在使用tint + AppCompat时才会出现这个问题。所以这是AppCompat + tint属性之间的问题,而不是tint属性本身的问题。


问题:当您更改矢量可绘制对象的色调时,是否使用VectorCompat加载可绘制对象?如果您手动尝试在代码中加载SVG以应用色调,则必须使用VectorCompat。 - Akshay
这些向量图是在XML中使用app:srcCompat属性引用的。 - chubbsondubs
根据文档,你只能在5.x及以上版本的可绘制对象(位图、矢量图等)上应用色彩渲染。请查看我的回答。 - Akshay
你确定这个问题不是你的问题吗?链接在这里:https://code.google.com/p/android/issues/detail?id=202670 - ligi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接