尝试在空对象引用上调用虚拟方法“android.graphics.drawable.Drawable.getBounds()”。

3
我有以下代码:

我有以下代码:

etEmail.setOnTouchListener((view, motionEvent) -> {
    final int DRAWABLE_RIGHT = 2;
    if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
        if(motionEvent.getRawX() >= (etEmail.getRight() - etEmail.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
            Utils.getInstance().showPopup("...",MainActivity.this,null);
            return true;
        }
    }
    return false;
});

虽然总体上看起来它是可以工作的,但我突然收到了一个Crashlytics报告,报告内容如下:

尝试在空对象引用上调用虚拟方法'android.graphics.Rect android.graphics.drawable.Drawable.getBounds()'

品牌:小米,型号:Redmi Note 6 Pro,Android版本:9。

这是什么原因导致Drawable“消失”或被视为null呢?请问有人知道吗?

XML布局:

    <EditText
        android:id="@+id/etEmail"
        tools:ignore="Autofill"
        android:inputType="textEmailAddress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableEnd="@drawable/ic_info"
        android:paddingEnd="12dp"
        android:paddingStart="10dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium" />

你知道 drawable 是否在展示吗? - Gil Goldzweig
我不知道,这来自于用户。 - Amos
2个回答

5
在你的xml中,它说drawableEnd,但在你的代码中,你假设它是右边的drawable。我有一种感觉,崩溃发生在一个使用RTL语言的设备上(这意味着drawable将会出现在左边)。

在我的情况下,那就是问题所在。 - Ali Asjad

1
在Crashlytics中,检查崩溃是否发生在后台或前台。如果是在后台,很可能是编辑文本已被销毁,因此您会收到npe(例如,在释放手指之前用户接到了电话)。如果不是,则需要更多的流程细节来帮助找出问题所在。

由于某种原因,它从Crashlytics中消失了。您所说的背景或前景是什么意思?该崩溃在同一用户身上发生了3-4次,所以除非他接了很多电话... :) 有一个带有电子邮件文本编辑和图标(可绘制)的登录窗口,单击时显示更多信息。用户单击了它(setontouch…)并收到了NPE。谢谢! - Amos
Crashlytics 仪表板通常会指明应用程序崩溃时是否可见。这在特定的崩溃统计信息中 - 显示后台事件的百分比。如果是100%的后台,那么意味着只有在应用程序不可见时才会发生崩溃。如果它也发生在应用程序可见时,您应该检查可能发生的情况。无论如何,如果仅在应用程序不可见时发生,则应进行空值检查以解决此问题。 - Orit Malki
谢谢你的提示,你能告诉我在崩溃统计数据中它显示在哪里吗?我找不到它。 - Amos
好的,找到了,背景为0%。 - Amos
好的,这很有道理,因为我现在看到问题与RTL配置有关,这可能是在应用程序可见时发生的。现在你也知道如何检测崩溃发生在用户流程中的哪个阶段了。 - Orit Malki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接