简体   繁体   English

AppCompat、Vectors 和 4.1.2 的奇怪崩溃

[英]Strange crash with AppCompat, Vectors and 4.1.2

I get a very strange crash being reported when I try and run my app on Android v4.1.2 (API 16).当我尝试在 Android v4.1.2 (API 16) 上运行我的应用程序时,我收到了一个非常奇怪的崩溃报告。 The following error I get on older phones:我在旧手机上遇到以下错误:

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)

I'm using vectors with the vectorDrawables.useSupportLibrary = true setting turned on in my gradle build file.我在我的 gradle 构建文件中使用了vectorDrawables.useSupportLibrary = true设置的向量。 I'm referring to my images using the following code:我指的是使用以下代码的图像:

<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"/>

My style is defined as following:我的风格定义如下:

<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>

I can't find any details online about this error.我在网上找不到有关此错误的任何详细信息。 I'm not sure why it's crashing.我不确定它为什么会崩溃。

@chubbsondubs seems like you can only apply tint to drawables from 5.0 and above? @chubbsondubs 似乎您只能将色调应用于 5.0 及更高版本的可绘制对象? here's the document [Official Android document]这是文档[官方Android文档]

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

I got the similar error and it seemed that "?android:textColorPrimary" may not be defined in some old systems.我遇到了类似的错误,似乎在某些旧系统中可能未定义“?android:textColorPrimary”。

My Solution:我的解决方案:
1. Define textColorPrimary in my own color.xml 1.在我自己的color.xml中定义textColorPrimary
2. Change "?android:textColorPrimary" to "@color/textColorPrimary" 2. 将“?android:textColorPrimary”改为“@color/textColorPrimary”

The drawable could be tinted no matter Vector or not in my Android 4.2.2 mobile无论是否在我的 Android 4.2.2 手机中使用 Vector,drawable 都可以着色

So I never figured out why Android is throwing this error.所以我一直不明白为什么 Android 会抛出这个错误。 After all the SDK tools should've replaced the @color reference with a proper integer from R class.毕竟 SDK 工具应该已经用 R 类中的适当整数替换了 @color 引用。 So what's the heck is happening?那么到底发生了什么?

Turns out it didn't like the use of the tint property in the style.原来它不喜欢在样式中使用 tint 属性。 If removed tint and replaced my vector drawable with a vector with the right color viola it worked.如果删除色调并将我的矢量 drawable 替换为带有正确颜色中提琴的矢量,它会起作用。 So it was hard to find out if tint was supported or not on API 16, but it sounded like tint was partially "supported", but not fully on API 16.因此,很难确定 API 16 是否支持 tint,但听起来像是部分“支持”了 tint,但 API 16 并未完全支持。

I was using tint property before and it was working, but it was not inheriting from that AppCompat style.我之前使用过 tint 属性并且它可以工作,但它不是从 AppCompat 样式继承的。 It only had this problem using tint + AppCompat.它只有使用 tint + AppCompat 才有这个问题。 So this is a problem between AppCompat + tint property, and not the tint property in general.所以这是 AppCompat + tint 属性之间的问题,而不是一般的 tint 属性。

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

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