繁体   English   中英

在API 19上渲染矢量资产时,Android App崩溃在20以上的API上正常运行

[英]Android App Crashes while rendering vector asset on API 19 works fine on API above 20

使用以下代码和堆栈跟踪在Android API级别19上启动MyActivity时,App崩溃。 在Android API 21级及更高版本上可以正常工作。

矢量资产: ic_warning_white_24px.xml

activity_my.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"
    tools:context="MyActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/inputLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp">

            <EditText
                android:id="@+id/editText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Hint" />

        </android.support.design.widget.TextInputLayout>

        <android.support.v7.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorAccent"
            android:drawableEnd="@drawable/ic_warning_white_24px"
            android:drawableRight="@drawable/ic_warning_white_24px"
            android:gravity="start|center_vertical"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:text="Button"
            android:textColor="@color/white" />

    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

MyActivity.java

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
    }
}

在我的build.gradle中也添加了以下内容

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

堆栈跟踪:

流程:MyPackage,PID:16398 java.lang.RuntimeException:无法启动活动ComponentInfo {MyPackage / MyActivity}:android.view.InflateException:二进制XML文件行#0:android.app.ActivityThread.performLaunchActivity(ActivityThread)的类膨胀错误.java:2184),位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233),位于android.app.ActivityThread.access $ 800(ActivityThread.java:135),位于android.app.ActivityThread $ H.handleMessage(ActivityThread.java :1196),位于android.os.Handler.dispatchMessage(Handler.java:102),位于android.os.Looper.loop(Looper.java:136),位于android.app.ActivityThread.main(ActivityThread.java:5001),位于Java .lang.reflect.Method.invokeNative(本地方法)(位于java.lang.reflect.Method.invoke(Method.java:515)位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)在dalvik.system.NativeStart.main(本机方法)造成原因:android.view.InflateException:Bi 无效的XML文件第0行:在android.view.LayoutInflater.createView(LayoutInflater.java:620)处在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)处发生错误的类在android.view.LayoutInflater.rInflate(LayoutInflater .java:755),位于android.view.LayoutInflater.rInflate(LayoutInflater.java:758),位于android.view.LayoutInflater.inflate(LayoutInflater.java:492),位于android.view.LayoutInflater.inflate(LayoutInflater.java:397)在android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)在android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java)上的android.view.LayoutInflater.inflate(LayoutInflater.java:353) :139),位于MyActivity.onCreate(MyActivity.java:43),位于android.app.Activity.performCreate(Activity.java:5231),位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087),位于android.app.ActivityThread, .performLaunchActivity(ActivityThread.java:2148)在android.app.ActivityThread.handleLaunchActivi ty(ActivityThread.java:2233)在android.app.ActivityThread.access $ 800(ActivityThread.java:135)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)在android.os.Handler.dispatchMessage( Handler.java:102)位于android.os.Looper.loop(Looper.java:136)位于android.app.ActivityThread.main(ActivityThread.java:5001)位于java.lang.reflect.Method.invokeNative(本机方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)处com.android.internal.os.ZygoteInit.main处的java.lang.reflect.Method.invoke(Method.java:515) (ZygoteInit.java:601)在dalvik.system.NativeStart.main(本机方法)造成原因:java.lang.reflect.Constructor.constructNative(本机方法)处的java.lang.reflect.InvocationTargetException。 android.view.LayoutInflater.createView(LayoutInflater.java:594)的Constructor.newInstance(Constructor.java:423)android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)的android.view.LayoutInflater android.view.LayoutInflater.rInflate(LayoutInflater.java:755)android.view.LayoutInflater.inflate(LayoutInflater.java:492)的android.view.LayoutInflater.inflate(LayoutInflater。 android.view.LayoutInflater.inflate(LayoutInflater.java:353)上的java:397)android.support.v7.app.AppCompatActivity.setContentView上的android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)上的java:397) (AppCompatActivity.java:139)在MyActivity.onCreate(MyActivity.java:43)在android.app.Activity.performCreate(Activity.java:5231)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)在android .app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)在android.app.ActivityThread.access $ 800(ActivityThread.java:135)在android.app.ActivityThread android.os.Handler.dispatchMessa上的$ H.handleMessage(ActivityThread.java:1196) android.os.Looper.loop(Looper.java:136)处的ge(Handler.java:102)java.lang.reflect.Method.invokeNative(Native)处android.app.ActivityThread.main(ActivityThread.java:5001)处在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)处java.lang.reflect.Method.invoke(Method.java:515)处com.android.internal.os.ZygoteInit dalvik.system.NativeStart.main处的.main(ZygoteInit.java:601)(本机方法)原因:android.content.res.Resources $ NotFoundException:文件来自可绘制资源ID的res / drawable / ic_warning_white_24px.xml

位于android.content.res.Resources.loadDrawable(Resources.java:2096)的0x7f080172

android.widget.TextView。(TextView.java:814)位于android.widget.Button。(Button.java:107)位于android.support.v7处的android.content.res.TypedArray.getDrawable(TypedArray.java:602) .widget.AppCompatButton。(AppCompatButton.java:71)在android.support.v7.widget.AppCompatButton。(AppCompatButton.java:67)在java.lang.reflect.Constructor.constructNative(本机方法)在java.lang.reflect android.view.LayoutInflater.createView(LayoutInflater.java:594)的.Constructor.newInstance(Constructor.java:423)android.view.LayoutInflater.rInflate(.android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)的。 android.view.LayoutInflater.rInflate(LayoutInflater.java:758)的LayoutInflater.java:755)android.view.LayoutInflater.inflate(LayoutInflater.java:397的android.view.LayoutInflater.inflate(LayoutInflater.java:492)的LayoutInflater.java:397 )在android.view.LayoutInflater.inflate(LayoutInflater.java:353)在android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)上 t位于MyActivity.onCreate(MyActivity.java:43)的android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)位于android.app的android.app.Activity.performCreate(Activity.java:5231)处。 Instrumentation.callActivityOnCreate(Instrumentation.java:1087)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)在android.app.ActivityThread.access $ 800( android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)上的ActivityThread.java:135)android.os.Looper.loop(Looper.java)上android.os.Handler.dispatchMessage(Handler.java:102)上的ActivityThread.java:135) :136),位于android.app.ActivityThread.main(ActivityThread.java:5001),位于java.lang.reflect.Method.invokeNative(Native Method),位于java.lang.reflect.Method.invoke(Method.java:515), com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)上的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)在dalvik.s ystem.NativeStart.main(本机方法)原因:org.xmlpull.v1.XmlPullParserException:二进制XML文件第0行:android处无效的drawable标签矢量。android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933) .graphics.drawable.Drawable.createFromXml(Drawable.java:877)在android.content.res.Resources.loadDrawable(Resources.java:2092)在android.content.res.TypedArray.getDrawable(TypedArray.java:602)在android.widget.TextView(TextView.java:814)(位于android.widget.Button。(Button.java:107)位于android.support.v7.widget.AppCompatButton。(AppCompatButton.java:71)位于android.support。 v7.widget.AppCompatButton。(AppCompatButton.java:67)在java.lang.reflect.Constructor.constructNative(本机方法)在java.lang.reflect.Constructor.newInstance(Constructor.java:423)在android.view.LayoutInflater android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)的.createView(LayoutInflater.java:594)android.view.LayoutInflater.rInflate(LayoutInflater.java:755)的.createView(LayoutInflater.java:594) 在android.view.LayoutInflater.rInflate(LayoutInflater.java:758)在android.view.LayoutInflater.inflate(LayoutInflater.java:492)在android.view.LayoutInflater.inflate(LayoutInflater.java:397)在android.view。 android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)上的LayoutInflater.inflate(LayoutInflater.java:353)在MyActivity上的android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) .onCreate(MyActivity.java:43)在android.app.Activity.performCreate(Activity.java:5231)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)在android.app.ActivityThread.performLaunchActivity(ActivityThread。位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)的android.app.ActivityThread.access $ 800(ActivityThread.java:135)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:的java:2148) 1196),位于android.o.android.os.Handler.dispatchMessage(Handler.java:102) android.app.ActivityThread.main(ActivityThread.java:5001)上的s.Looper.loop(Looper.java:136)在java.lang.reflect.Method上的java.lang.reflect.Method.invokeNative(Native Method)上。 dalvik的com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)的invoke(Method.java:515) .system.NativeStart.main(本机方法)

还尝试了几件事

static
{
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
    }
}

您不能将矢量drawable用作drawableLeft, drawableRight 抱歉。

也尝试

        app:drawableEnd="@drawable/ic_warning_white_24px"
        app:drawableRight="@drawable/ic_warning_white_24px"

代替

        android:drawableEnd="@drawable/ic_warning_white_24px"
        android:drawableRight="@drawable/ic_warning_white_24px"

(应用程式与Android)

如果AppCompatButton实现了它,则可以通过这种方式使用它。

看到这个问题是否可以使用android:DrawableRight在Buttons和TextViews中使用VectorDrawable?

请参阅这篇关于向量的很棒的文章AppCompat —向量的年龄

我有同样的问题。

我的解决方案是添加AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

1)创建方法上的应用程序(如果有)

public class TestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

2) 对您特定的Acticivity onCreate()

public class TestActivity extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

暂无
暂无

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

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