Окно Get генерирует исключение нулевого указателя при ссылке из другого класса - PullRequest
2 голосов
/ 29 апреля 2020

Я использую PDFViewer во фрагменте в Android Studio. Библиотека найдена здесь: https://github.com/barteksc/AndroidPdfViewer

Эта библиотека прекрасно работает, когда я разрешаю библиотеке обрабатывать все сенсорные события, но я хочу скрыть системные панели инструментов в своем действии (SingleTouchImageViewActivity), когда происходит событие onSingleTapConfirmed. Так как OnTouchListener находится в другом классе (DragPinchManager), я не могу сослаться на Окно в моей Деятельности, чтобы отметить полноэкранный режим. Я получаю исключение нулевого указателя.

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 publi c 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), передавая тот контекст, который он получил от SingleTouchImageViewActivity, когда PDF-файл инициировал событие одиночного касания. По какой-то причине stiva имеет значение null, когда DragPinchManager пытается сослаться на него. Можете ли вы помочь мне с этим?

Кроме того, я не уверен, как использовать контекст, который я передаю в hideSystemUI ().

Вот то, что я думаю, что это будет, но я думаю, Я далеко ...

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

1 Ответ

0 голосов
/ 29 апреля 2020

Как сказал @CommonsWare, никогда не создавайте экземпляр действия самостоятельно.

Этот cra * sh, потому что вы используете объект окна, а в вашем действии нет окна!

Чтобы исправить эту проблему , запустите свою деятельность, используя Намерение

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

    startActivity(i);
}

А затем внутри onCreate из SingleTouchImageViewActivity вызов hideSystemUI метод

...