【问题标题】:Strange crash with AppCompat, Vectors and 4.1.2AppCompat、Vectors 和 4.1.2 的奇怪崩溃
【发布时间】:2016-07-10 16:22:27
【问题描述】:

当我尝试在 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 版本上解析 svgs 时遇到了问题:stackoverflow.com/questions/27561170/…code.google.com/p/android/issues/detail?id=202670。您能否看看 SO 帖子和 google 代码问题中概述的解决方案是否对您有所帮助?
  • 嗯,事实上它在 App Compat 样式中明显存在问题。我没有包括的一件事是我重构了我以前没有从 AppCompat 样式继承的样式。这适用于 API 16。是的,它是 NumberFormatException,但请注意它试图解析的内容。为什么 SDK 没有用正确的整数替换它?我其实知道答案。
  • 好收获。感谢您提供有关在解析颜色资源时出错的信息和要点。

标签: android material-design android-appcompat


【解决方案1】:

@chubbsondubs 似乎只能将色调应用于 5.0 及更高版本的可绘制对象?这是文档[Android官方文档]

[1]https://developer.android.com/training/material/drawables.html

【讨论】:

  • 听起来可能毕竟是问题所在,但该平台从未抱怨过使用它。通常,如果我尝试使用我的 minSDK Android Studio 不支持的 API、属性等,则会抱怨它。在这种情况下,它从未抱怨过。
  • 如果您认为这是正确答案,请采纳。
【解决方案2】:

我收到了类似的错误,似乎某些旧系统中可能未定义“?android:textColorPrimary”。

我的解决方案:
1.在我自己的color.xml中定义textColorPrimary
2. 将“?android:textColorPrimary”改为“@color/textColorPrimary”

在我的 Android 4.2.2 手机中,无论​​ Vector 与否,drawable 都可以着色

【讨论】:

    【解决方案3】:

    所以我从来没有弄清楚为什么 Android 会抛出这个错误。毕竟 SDK 工具应该已经用 R 类的正确整数替换了 @color 引用。那么到底发生了什么?

    原来它不喜欢在样式中使用 tint 属性。如果删除色调并将我的矢量可绘制对象替换为具有正确颜色的中提琴的矢量,则它可以工作。因此很难确定 API 16 是否支持 tint,但听起来好像 tint 部分“支持”,但并非完全在 API 16 上。

    我之前使用了 tint 属性并且它可以工作,但它不是从那个 AppCompat 样式继承的。它只有使用 tint + AppCompat 才有这个问题。所以这是 AppCompat + tint 属性之间的问题,而不是一般的 tint 属性。

    【讨论】:

    • 问题,当您更改矢量绘图的色调时,您是否使用 VectorCompat 来加载绘图?如果您手动尝试在代码中加载 svgs 以应用色调,那么您必须使用 VectorCompat
    • 这些向量是使用 XML 中的 app:srcCompat 属性引用的。
    • 查看我的答案,根据文档,您只能在 5.x 及更高版本的可绘制对象(位图、矢量等)上应用色调。
    • 确定:code.google.com/p/android/issues/detail?id=202670 不是您的问题?
    猜你喜欢
    • 2013-11-16
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2023-02-02
    • 2016-10-27
    相关资源
    最近更新 更多