NullPointerException при вызове ImageView.getDrawable () в onDraw () - PullRequest
0 голосов
/ 15 октября 2018

У меня есть собственный ImageView, и я пытаюсь использовать getDrawable() в onDraw() методе ImageView.Теперь это, кажется, работает нормально для большинства устройств и версий Android, однако теперь я начал получать NullPointerException на Google Pixel 2 (Android 9) и некоторых других устройствах, работающих под управлением Android 7.0.

Кто-нибудь знает, почему это происходит?

public class CustomImageView extends android.support.v7.widget.AppCompatImageView {

    ...

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Drawable drawable = getDrawable();
        if (drawable == null)
            throw new NullPointerException("drawable must not be null");
    }

    ...

}

NPE выглядит следующим образом:

Fatal Exception: java.lang.NullPointerException: drawable must not be null
   at de.simonmayrshofer.dfvafftrainer.imagemagnifier.ImageMagnifier.onDraw(ImageMagnifier.java:109)
   at android.view.View.draw(View.java:20207)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at android.widget.ScrollView.draw(ScrollView.java:1739)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at com.android.internal.policy.DecorView.draw(DecorView.java:780)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
   at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
   at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:801)
   at android.view.ViewRootImpl.draw(ViewRootImpl.java:3312)
   at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3116)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2485)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7184)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
   at android.view.Choreographer.doCallbacks(Choreographer.java:761)
   at android.view.Choreographer.doFrame(Choreographer.java:696)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
   at android.os.Handler.handleCallback(Handler.java:873)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:193)
   at android.app.ActivityThread.main(ActivityThread.java:6669)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/xxx"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:animateLayoutChanges="true"
            android:gravity="bottom"
            android:orientation="vertical">

             <de.xxx.CustomImageView
                    android:id="@+id/xxx"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/fragment_margin"
                    android:adjustViewBounds="true"
                    android:scaleType="fitCenter"
                    android:src="someimage.png"
                    android:visibility="gone" />

        </LinearLayout>

    </ScrollView>

</RelativeLayout>

И я использую Picasso для загрузки изображения из моих активов в onCreateView() в ImageView:

Picasso.with(getActivity()).load("file:///android_asset/img/abc.jpg".into(imageView);
...