API 19:android.view.InflateException:二进制 XML 文件行 #0:膨胀类 SeekBar 时出错
Posted
技术标签:
【中文标题】API 19:android.view.InflateException:二进制 XML 文件行 #0:膨胀类 SeekBar 时出错【英文标题】:API 19 : android.view.InflateException: Binary XML file line #0: Error inflating class SeekBar 【发布时间】:2018-06-16 02:21:54 【问题描述】:我有以下布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootConstraintLayout"
android:layout_
android:layout_
android:background="@color/colorPrimary"
tools:context="mtronics.alertme.HomePage">
<TextView
android:id="@+id/tvSpeedSet"
android:layout_
android:layout_
android:text="My Limit : 0 Km/h"
android:textAlignment="center"
android:textColor="@color/colorText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/speedView" />
<SeekBar
android:id="@+id/seekBarSpeedSet"
android:layout_
android:layout_
android:background="@drawable/corner_fillet_background"
android:max="200"
android:progress="0"
android:thumb="@drawable/icon_seek_thumb"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvSpeedSet" >
</SeekBar>
<ListView
android:id="@+id/listAlerts"
android:layout_
android:layout_
android:layout_gravity="center"
android:layout_weight="1"
android:divider="@color/colorTransparent"
android:dividerHeight="8dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarSpeedSet">
</ListView>
</android.support.constraint.ConstraintLayout>
可绘制文件 icon_seek_thumb.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<size
android:
android: />
<solid android:color="@android:color/transparent" />
</shape>
</item>
<item android:drawable="@drawable/ic_seek_thumb"/>
</layer-list>
ic_seek_thumb.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:
android:
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@color/colorText"
android:pathData="...."/>
</vector>
使用上面的布局,我只收到 API 19 的以下错误,更高版本可以正常工作 注意:如果我从 seekbar 中删除 android:thumb ,它也适用于 API 19
当我尝试在 API 19 中执行时出现以下错误
android.view.InflateException: Binary XML file line #0: Error inflating class SeekBar
【问题讨论】:
【参考方案1】:一旦我遇到了同样的问题。我修复了将所有可绘制文件放在 drawable 文件夹下的问题。我的问题是一些可绘制文件仅存在于 drawable -xxdpi 中,而不存在于较低 API 级别查找文件的 drawable 文件夹中。..
替换可绘制文件夹中的所有文件,这可能会解决您的问题。
【讨论】:
是的 :P 我在 v21 上测试时在 v24 中有一些资源 :)【参考方案2】:对 VectorDrawables 的支持已添加到 API 21 的框架中,因此 API 19 不支持它们 - 因此导致崩溃。
支持库提供了一个向后移植的版本VectorDrawableCompat
,您可以在较低的 Android 版本上使用它。不幸的是,如果我没记错的话,它在从 xml 膨胀时不会挂在搜索栏拇指中。
要解决这个问题,您必须在 java 中创建拇指 Drawable 并手动将其设置到您的 Seekbar。
首先确保您的 build.gradle
中有 AppCompat:
api "com.android.support:appcompat-v7:$supportLibVersion"
然后在您使用Seekbar
的java 类中创建一个新方法来设置拇指。以下应该等同于您的原始 xml:
private void initThumbDrawable()
final int size = convertDpToPixel(40);
GradientDrawable square = new GradientDrawable();
square.setShape(GradientDrawable.RECTANGLE);
square.setSize(size, size);
square.setColor(Color.TRANSPARENT);
VectorDrawableCompat thumb = VectorDrawableCompat.create(getResources(), R.drawable. ic_seek_thumb, null);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] square, thumb);
seekBar.setThumb(layerDrawable);
private int convertDpToPixel(int dp)
DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
如果您将填充包含在矢量中而不是使用图层列表,它可能会更简单!
最后一定要去掉:
android:thumb="@drawable/icon_seek_thumb"
来自您的布局 xml 文件
【讨论】:
谢谢 Jahnold,我会试试你的建议。 嗨,Jahnold,我刚刚看到我的旧代码在哪里使用 drawable 作为 seekbar thumb,该代码适用于 API 15 到 API 19。 是的,只要不是 VectorDrawable 或包含 VectorDrawable,您就可以使用可绘制对象以上是关于API 19:android.view.InflateException:二进制 XML 文件行 #0:膨胀类 SeekBar 时出错的主要内容,如果未能解决你的问题,请参考以下文章
LoactionManager Api19 NullPointerException
Android Studio API 19:谷歌地方未找到 api 异常 15