API 19:android.view.InflateException:二进制XML文件行#0:错误膨胀类SeekBar

时间:2018-01-06 13:15:25

标签: java android xml android-layout android-fragments

我有以下布局文件

<?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_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimary"
    tools:context="mtronics.alertme.HomePage">


    <TextView
        android:id="@+id/tvSpeedSet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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_width="0dp"
        android:layout_height="wrap_content"
        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_width="0dp"
        android:layout_height="0dp"
        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:height="40dp"
                android:width="40dp" />
            <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:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="@color/colorText"
        android:pathData="...."/>
</vector>

在上面的布局中,我只得到API 19的跟随错误,因为它正在工作 注意:如果我从搜索栏中删除android:thumb,它也适用于API 19

当我尝试在API 19中执行时,我收到以下错误

android.view.InflateException: Binary XML file line #0: Error inflating class SeekBar

2 个答案:

答案 0 :(得分:1)

对API 21中的框架添加了对VectorDrawables的支持,因此它们在API 19中不受支持 - 因此崩溃。

支持库提供了一个可以在较低Android版本上使用的反向移植版本VectorDrawableCompat。不幸的是,如果我没记错的话,从xml充气时它不会挂钩到seekbar拇指。

要解决此问题,您必须在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文件的

答案 1 :(得分:0)

一旦我遇到同样的问题。我修复了它将所有可绘制文件放在 drawable 文件夹下。我的问题是一些可绘制的文件仅出现在 drawable -xxdpi 而不是 drawable 文件夹中,其中较低的API级别查找该文件..

替换可绘制文件夹中可能解决您问题的所有文件。