【发布时间】:2020-08-12 23:15:33
【问题描述】:
我在 Android Studio 的 Fragment 中使用 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;
@覆盖 公共布尔 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);
【问题讨论】:
-
new SingleTouchImageViewActivity()-- 从不自己创建活动实例。无论对象包含您的onSingleTapConfirmed()方法,都需要将现有的SingleTouchImageViewActivity实例传递给它,这样您就可以在字段中保留它,然后在其上调用方法。 -
@CommonsWare 能否举个例子说明如何传入现有的 SingleTouchImageViewActivity 实例?
-
In this sample 来自this book,我的活动将
LayoutInflater传递给我的ColorAdapter。我可以很容易地让我的活动将活动本身传递给我的ColorAdapter,并且ColorAdapter可以在活动本身上调用getLayoutInflater()。 -
@CommonsWare 你能再看一下这个问题吗?我更新了它以及我的代码。我不确定是否需要传递活动本身或是否需要传递上下文。谢谢你的帮助。我真的很感激。
-
您的代码似乎没有传递任何东西。相反,您似乎正在通过将
Context放入static字段来创建可能的内存泄漏。据推测,您的活动正在创建DragPinchManager的实例。如果是这样,请将Activity通过其构造函数传递给DragPinchManager,例如how this constructor accepts aLayoutInflater。
标签: java android nullpointerexception touch listener