首页 > 解决方案 > 从另一个类引用时获取窗口抛出空指针异常

问题描述

我在 Android Studio 的片段中使用 PDFViewer。图书馆在这里找到:https ://github.com/barteksc/AndroidPdfViewer

当我允许库处理所有触摸事件时,该库工作正常,但我想在发生 onSingleTapConfirmed 事件时隐藏我的活动 (SingleTouchImageViewActivity) 中的系统工具栏。由于 OnTouchListener 在另一个类 (DragPinchManager) 中,我无法在我的 Activity 中引用 Window 来标记全屏。我得到一个空指针异常。

2020-04-28 19:00:02.952 22265-22265/com.biggerbytes.gospeltruth E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.biggerbytes.gospeltruth, PID: 22265
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.Window.addFlags(int)' on a null object reference
    at com.biggerbytes.gospeltruth.SingleTouchImageViewActivity.hideSystemUI(SingleTouchImageViewActivity.java:1109)
    at com.biggerbytes.gospeltruth.SingleTouchImageViewActivity.runFullScreenCheck(SingleTouchImageViewActivity.java:900)
    at com.github.barteksc.pdfviewer.DragPinchManager.onSingleTapConfirmed(DragPinchManager.java:80)
    at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:316)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7073)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

这是 DragPinchManager 中的代码:

Context stivaContext;

@Override public boolean onSingleTapConfirmed(MotionEvent e) {

    SingleTouchImageViewActivity singleTouchImageViewActivity = new SingleTouchImageViewActivity();
    stivaContext = singleTouchImageViewActivity.getStivaContext();
    singleTouchImageViewActivity.hideSystemUI(stivaContext);
    return true;
}

SingleTouchImageViewActivity 中对应的代码如下:

Context stiva;    

 @Override
public View onCreateView(String name, Context context, AttributeSet attrs) {

    stiva = context;

    if(FullScreenMode) {
        hideSystemUI(stiva);
    }


    public void hideSystemUI(Context context) {
    FullScreenMode = true;
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    if(Build.VERSION.SDK_INT < 19) { // lower api
        getWindow().getDecorView().setSystemUiVisibility(View.GONE);
    } else {
        //for new api versions.
    //    View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        getWindow().getDecorView().setSystemUiVisibility(uiOptions);
    }

    toolbarTop.setVisibility(View.GONE);
    toolbarBottom.setVisibility(View.GONE);
}

如何修复我的 nullPointerException 并在 SingleTapConfirmed 上隐藏我的导航?谢谢你!

更新:这就是我所做的。我在 SingleTouchImageViewActivity 中设置了一个名为 stiva 的上下文变量。我在调用 onCreateView 时设置它。pdf加载后,我单击我的pdf。DragPinchManager 调用一个方法从 SingleTouchImageViewActivity 获取上下文,然后调用 hideSystemUI(stiva),传入它在 pdf 触发单击事件时从 SingleTouchImageViewActivity 接收到的上下文。出于某种原因,当 DragPinchManager 尝试引用 stiva 时,它为空。你能帮我解决这个问题吗?

另外,我不确定如何使用传递给 hideSystemUI() 的上下文。

这就是我的想法,但我认为我离...

SingleTouchImageViewActivity.context.getWindow().getDecorView().setSystemUiVisibility(View.GONE);

标签: javaandroidnullpointerexceptiontouchlistener

解决方案


正如@CommonsWare 所说,永远不要自己创建活动实例。

这是因为您使用了窗口对象而您的活动没有窗口!

要解决此问题,请使用 Intent 启动您的活动

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Intent i = new Intent(this, SingleTouchImageViewActivity.class);

    startActivity(i);
}

然后在onCreate调用SingleTouchImageViewActivity方法hideSystemUI里面


推荐阅读