首页 > 解决方案 > Android 4.1 崩溃 - XML(矢量图像)

问题描述

我在尝试在较旧的 android 版本中运行我的代码时遇到崩溃,但它在较新的版本上运行良好。

这是我得到的日志。

09-19 08:10:46.741 6803-6803/? I/art: Not late-enabling -Xcheck:jni (already on)
09-19 08:10:46.792 6803-6803/com.example.rjrod.legendchat W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
09-19 08:10:46.932 6803-6823/com.example.rjrod.legendchat D/OpenGLRenderer: Render dirty regions requested: true
09-19 08:10:46.941 6803-6803/com.example.rjrod.legendchat D/Atlas: Validating map...
09-19 08:10:46.964 6803-6823/com.example.rjrod.legendchat I/OpenGLRenderer: Initialized EGL, version 1.4
09-19 08:10:46.964 6803-6823/com.example.rjrod.legendchat W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
09-19 08:10:47.025 6803-6823/com.example.rjrod.legendchat D/EGL_emulation: eglCreateContext: 0x7f4e07a13200: maj 2 min 0 rcv 2
09-19 08:10:47.035 6803-6823/com.example.rjrod.legendchat D/EGL_emulation: eglMakeCurrent: 0x7f4e07a13200: ver 2 0
09-19 08:10:47.043 6803-6823/com.example.rjrod.legendchat D/OpenGLRenderer: Enabling debug mode 0
09-19 08:10:47.123 6803-6823/com.example.rjrod.legendchat D/EGL_emulation: eglMakeCurrent: 0x7f4e07a13200: ver 2 0
09-19 08:10:47.188 6803-6803/com.example.rjrod.legendchat D/MensagemAdapter: getView: 18
09-19 08:10:47.188 6803-6803/com.example.rjrod.legendchat D/Num: getView: 1 98
09-19 08:10:47.229 6803-6803/com.example.rjrod.legendchat D/MensagemAdapter: getView: 17
09-19 08:10:47.229 6803-6803/com.example.rjrod.legendchat D/Num: getView: 4 97
09-19 08:10:47.233 6803-6803/com.example.rjrod.legendchat W/ResourceType: Failure getting entry for 0x7f070056 (t=6 e=86) (error -75)
    Failure getting entry for 0x7f070056 (t=6 e=86) (error -75)
09-19 08:10:47.233 6803-6803/com.example.rjrod.legendchat D/AndroidRuntime: Shutting down VM
09-19 08:10:47.233 6803-6803/com.example.rjrod.legendchat E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.rjrod.legendchat, PID: 6803
    android.view.InflateException: Binary XML file line #66: Error inflating class ImageView
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
        at com.example.rjrod.legendchat.adapter.MensagemAdapter.getView(MensagemAdapter.java:86)
        at android.widget.AbsListView.obtainView(AbsListView.java:2344)
        at android.widget.ListView.makeAndAddView(ListView.java:1864)
        at android.widget.ListView.fillUp(ListView.java:732)
        at android.widget.ListView.layoutChildren(ListView.java:1677)
        at android.widget.AbsListView.onLayout(AbsListView.java:2148)
        at android.view.View.layout(View.java:15596)
        at android.view.ViewGroup.layout(ViewGroup.java:4966)
        at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
        at android.view.View.layout(View.java:15596)
        at android.view.ViewGroup.layout(ViewGroup.java:4966)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
        at android.view.View.layout(View.java:15596)
        at android.view.ViewGroup.layout(ViewGroup.java:4966)
        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)

    ....

这是我的改造代码。

这是 api API的代码

public interface LegendAPI {

    String BASE_URL = "https://private-96848-7egend.apiary-mock.com/";

    @Headers("Content-Type: Application/json")
    @GET("conversation")
    Call<Feed> getStuff();
}

主要的

call.enqueue(new Callback<Feed>() {
                @Override
                public void onResponse(Call<Feed> call, Response<Feed> response) {
                    Log.d(TAG, "onResponse: Server Response: " + response.toString());
                    //Log.d(TAG, "onResponse: Received information " + response.body().toString());

                    messagesList = response.body().getMessages();
                    usersList = response.body().getUser();
                    adapter = new MensagemAdapter(MainActivity.this, messagesList.subList(messagesList.size()-20,messagesList.size()-1),usersList);
                    for (int i = 0; i < messagesList.size(); i++) {
                        Message message = messagesList.get(i);
                        attachments = message.getAttachments();
                        if (i == messagesList.size()-1){

                            saveInfo();
                            Log.d(TAG, "loadInfo: " + usersList);
                        }
...

错误将我发送到这里。

else {
                    assert inflater != null;
                    **view = inflater.inflate(R.layout.left_no_attach, parent, false);**

提前致谢。如果您需要任何其他帮助我,请随时询问。

添加布局代码 布局

<?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:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageViewA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:visibility="gone"
        app:layout_constraintStart_toStartOf="@+id/tv_mensage"
        app:layout_constraintTop_toBottomOf="@+id/tv_mensage"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/imageViewB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:visibility="gone"
        app:layout_constraintStart_toStartOf="@+id/imageViewA"
        app:layout_constraintTop_toBottomOf="@+id/imageViewA"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/imageViewC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:visibility="gone"
        app:layout_constraintStart_toStartOf="@+id/imageViewB"
        app:layout_constraintTop_toBottomOf="@+id/imageViewB"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/avatarIm"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="8dp"
        app:layout_constraintBottom_toBottomOf="@+id/tv_mensage"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/nomeId"
        app:srcCompat="@drawable/ic_launcher_foreground" />

    <ImageView
        android:id="@+id/imageViewD"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:visibility="gone"
        app:layout_constraintStart_toStartOf="@+id/imageViewC"
        app:layout_constraintTop_toBottomOf="@+id/imageViewC"
        app:layout_goneMarginBottom="15dp"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/nomeId"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignStart="@+id/tv_mensage"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="16dp"
        android:fontFamily="@font/roboto_bold"
        android:text="TextView"
        android:textAlignment="viewStart"
        android:textColor="@android:color/white"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/tv_mensage"
        app:layout_constraintStart_toStartOf="@+id/tv_mensage"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_mensage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginStart="16dp"
        android:layout_marginTop="32dp"
        android:layout_toEndOf="@+id/avatarIm"
        android:background="@drawable/roundwhite"
        android:fontFamily="@font/roboto"
        android:maxWidth="500dp"
        android:padding="8dp"
        android:text="Menasagem"
        android:textAlignment="viewStart"
        android:textColor="@android:color/black"
        app:layout_constraintStart_toEndOf="@+id/avatarIm"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

适配器

公共类 MensagemAdapter 扩展 ArrayAdapter {

private Context context;
private List<Message> messages;
private List<Users> users;
private static final String TAG = "MensagemAdapter";


public MensagemAdapter(@NonNull Context context, @NonNull List<Message> objects, @NonNull List<Users> users) {
    super(context, 0, objects);
    this.context=context;
    this.messages = objects;
    this.users = users;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View view = null;
    Log.d(TAG, "getView: " + position);


        if (messages != null) {

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            Message message = messages.get(position);
            Log.d("Num", "getView: " + message.getUserId() + " " + message.getId());
            if (message.getUserId() == 1) {
                assert inflater != null;
                view = inflater.inflate(R.layout.right_no_attach, parent, false);
                TextView textoMensagem = view.findViewById(R.id.tv_mensage);
                textoMensagem.setText(message.getContent());
                if (message.getAttachments() != null) {

                    for (int i = 0; i < message.getAttachments().size(); i++) {
                        //view = inflater.inflate(R.layout.right_attach,parent,false);
                        if (i == 0) {
                            ImageView attach = view.findViewById(R.id.imageView1);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);

                        } else if (i == 1) {
                            ImageView attach = view.findViewById(R.id.imageView2);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        } else if (i == 2) {
                            ImageView attach = view.findViewById(R.id.imageView3);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        } else {
                            ImageView attach = view.findViewById(R.id.imageView3);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        }

                    }
                }

            } else {
                assert inflater != null;
                view = inflater.inflate(R.layout.left_no_attach, parent, false);
                TextView nomeMensagem = view.findViewById(R.id.nomeId);
                nomeMensagem.setText(users.get(message.getUserId() - 1).getName());
                ImageView avatar = view.findViewById(R.id.avatarIm);
                Picasso.get().load(users.get(message.getUserId() - 1).getAvatarId()).transform(new CircleTransform()).into(avatar);
                TextView textoMensagem = view.findViewById(R.id.tv_mensage);
                textoMensagem.setText(message.getContent());
                if (message.getAttachments() != null) {

                    for (int i = 0; i < message.getAttachments().size(); i++) {
                        //view = inflater.inflate(R.layout.right_attach,parent,false);
                        if (i == 0) {
                            ImageView attach = view.findViewById(R.id.imageViewA);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);

                        } else if (i == 1) {
                            ImageView attach = view.findViewById(R.id.imageViewB);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        } else if (i == 2) {
                            ImageView attach = view.findViewById(R.id.imageViewC);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        } else {
                            ImageView attach = view.findViewById(R.id.imageViewD);
                            attach.setVisibility(View.VISIBLE);
                            Picasso.get().load(message.getAttachments().get(i).getThumbnailUrl()).into(attach);
                        }

                    }
                }

            }


            if (message.getAttachments() == null) {
                TextView textoMensagem = view.findViewById(R.id.tv_mensage);

                textoMensagem.setText(message.getContent());
            }



    }
    return view;
    }



}

标签: androidretrofit2android-inflate

解决方案


In your error logs, I think it's not because of retrofit2.

InflateException: Binary XML file line #66: Error inflating class ImageView

Are you using vector images in this layout file ?? If you do, make sure you're already have this line in your gradle, Because API 19 or lower do not supported vector image, so you should enable vectorDrawables:

    vectorDrawables.useSupportLibrary = true

And also this in your BaseActitivy or in any Activity you're using vector images:

static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

Good luck


推荐阅读