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

可绘制不适用于 API 19

API等级19的抽屉活动

Android Studio API 19:谷歌地方未找到 api 异常 15

api 级别 19 的工具栏 setOnScrollChangeListener()

如何获取小于 19 的 API 的 Drawable 的 alpha 值