AppCompat、Vectors 和 4.1.2 发生奇怪的崩溃
Strange crash with AppCompat, Vectors and 4.1.2
当我尝试 运行 我的应用程序 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.access0(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.access0(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>
我在网上找不到关于此错误的任何详细信息。我不确定它为什么会崩溃。
所以我一直不明白为什么 Android 会抛出这个错误。毕竟 SDK 工具应该用 R class 中的适当整数替换 @color 引用。那么到底发生了什么?
原来它不喜欢在样式中使用色调 属性。如果删除色调并将我的可绘制矢量替换为具有正确颜色中提琴的矢量,它就可以工作。因此很难确定 API 16 是否支持色调,但听起来色调部分 "supported",但 API 16 不完全。
我之前使用的是 tint 属性,它可以正常工作,但它不是从 AppCompat 样式继承的。只有使用 tint + AppCompat 时才会出现这个问题。所以这是 AppCompat + tint 属性 之间的问题,而不是一般的 tint 属性。
@chubbsondubs 似乎只能对 5.0 及更高版本的可绘制对象应用色调?这是文档 [官方 Android 文档]
[1]https://developer.android.com/training/material/drawables.html
我遇到了类似的错误,似乎“?android:textColorPrimary”在某些旧系统中可能没有定义。
我的解决方案:
1.自己定义textColorPrimarycolor.xml
2. 将“?android:textColorPrimary”更改为“@color/textColorPrimary”
在我的Android 4.2.2 移动设备
中,无论矢量与否,可绘制对象都可以着色
当我尝试 运行 我的应用程序 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.access0(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.access0(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>
我在网上找不到关于此错误的任何详细信息。我不确定它为什么会崩溃。
所以我一直不明白为什么 Android 会抛出这个错误。毕竟 SDK 工具应该用 R class 中的适当整数替换 @color 引用。那么到底发生了什么?
原来它不喜欢在样式中使用色调 属性。如果删除色调并将我的可绘制矢量替换为具有正确颜色中提琴的矢量,它就可以工作。因此很难确定 API 16 是否支持色调,但听起来色调部分 "supported",但 API 16 不完全。
我之前使用的是 tint 属性,它可以正常工作,但它不是从 AppCompat 样式继承的。只有使用 tint + AppCompat 时才会出现这个问题。所以这是 AppCompat + tint 属性 之间的问题,而不是一般的 tint 属性。
@chubbsondubs 似乎只能对 5.0 及更高版本的可绘制对象应用色调?这是文档 [官方 Android 文档]
[1]https://developer.android.com/training/material/drawables.html
我遇到了类似的错误,似乎“?android:textColorPrimary”在某些旧系统中可能没有定义。
我的解决方案:
1.自己定义textColorPrimarycolor.xml
2. 将“?android:textColorPrimary”更改为“@color/textColorPrimary”
在我的Android 4.2.2 移动设备
中,无论矢量与否,可绘制对象都可以着色