0

I have one quite tricky query about how to implement onBackPressed for both DrawerLayout which is in MainActivity and in fragment for webView.

Following is tree structure of my android app.


                                ----------- HomeFragment(WebView)
                               |
MainActivity(Drawer)----------- ----------- DashBoardFragment
                               |
                                ----------- NotificationFragment

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    android:id="@+id/drawer"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:id="@+id/main"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/mobile_navigation"
            tools:ignore="FragmentTagUsage" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/nav_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="0dp"
            android:layout_marginEnd="0dp"
            android:background="?android:attr/windowBackground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:menu="@menu/bottom_nav_menu" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <com.google.android.material.navigation.NavigationView
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:menu="@menu/bottom_nav_menu"
        android:id="@+id/navigationView">

    </com.google.android.material.navigation.NavigationView>

</androidx.drawerlayout.widget.DrawerLayout>


MainActivity.java


public class MainActivity extends AppCompatActivity {

/* code of Drawer is here */

    }

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START))
        {
            drawer.closeDrawer(GravityCompat.START);
        }
        else if (webView.canGoBack()){
            webView.goBack();
        }else {
            super.onBackPressed();
        }
    }
}

Home_Fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.home.HomeFragment">

    <LinearLayout
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp"
        tools:ignore="MissingConstraints">

        <WebView
            android:id="@+id/myWebView"
            android:layout_width="match_parent"
            android:layout_height="601dp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

HomeFragment.java

public class HomeFragment extends Fragment {

   /* code of WebView is here */
}

/* here is problem */

    @Override
    public void onBackPressed() {
        /* have place code here to handle back Press button */
    }
}

My Query :-

  1. I have to use onBackPressed() method in MainActivity.java for DrawerLayout.
  2. And onBackPressed() method in HomeFragment.java for WebView.

The problem is I can use onBackPressed() method either in MainActivity.java or HomeFragment.java but I have to use onBackPressed() method in both files.

Look at screenshot, red square is my webview which is in Home_Fragment, i want 1 onBackPressed Method for whole app i mean for Drawerlayout and 1 onBackPressed() method for inside of webView

Look at screenshot, red square is my webview which is in Home_Fragment

Its the opened post inside the webview, onBackPressed Method will send me back to my webview main page when i click backButton

Its the opened post inside the webview, onBackPressed Method will send me back to my webview main page when i click backButton

But I am getting this message when i press backbutton

enter image description here

[EDIT 1] : error code in RUN terminal

E/InputEventSender: Exception dispatching finished signal.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.webkit.WebView.canGoBack()' on a null object reference
        at com.example.modapk4everyone.MainActivity.onBackPressed(MainActivity.java:60)
        at android.app.Activity.onKeyUp(Activity.java:3641)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2844)
        at android.app.Activity.dispatchKeyEvent(Activity.java:3958)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:122)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:140)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2814)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:367)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5414)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5282)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4948)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5005)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4981)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5142)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3064)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2607)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2598)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3041)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:336)
        at android.os.Looper.loop(Looper.java:174)
        at android.app.ActivityThread.main(ActivityThread.java:7397)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.modapk4everyone, PID: 20714
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.webkit.WebView.canGoBack()' on a null object reference
        at com.example.modapk4everyone.MainActivity.onBackPressed(MainActivity.java:60)
        at android.app.Activity.onKeyUp(Activity.java:3641)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2844)
        at android.app.Activity.dispatchKeyEvent(Activity.java:3958)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:122)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:84)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:140)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:558)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2814)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:367)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5414)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5282)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4948)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5005)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4981)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5142)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3064)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2607)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2598)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3041)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:336)
        at android.os.Looper.loop(Looper.java:174)
        at android.app.ActivityThread.main(ActivityThread.java:7397)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
I/Process: Sending signal. PID: 20714 SIG: 9
  • To receive help from StackOverflow community make sure you follow [how-to-ask](https://stackoverflow.com/help/how-to-ask) guidelines and that your question presents [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). – Jenea Vranceanu Jun 21 '20 at 07:09
  • Am not very clear about your problem but am guessing that you want to pass back pressed event to your activity from fragment? – Geo Jun 21 '20 at 07:26
  • I have edited to minimal required code please approve my question and provide me solution. – Sanket Bhosale Jun 21 '20 at 15:19
  • Checking the logcat for the error should always be your first step when app crashes. Check it and also add it here so we can help. – Lalit Fauzdar Jun 21 '20 at 19:53
  • @LalitFauzdar look at the error i got, i have edited on post – Sanket Bhosale Jun 23 '20 at 05:06
  • The error says problem is here - `else if(webView.canGoBack())` and its a `NullPointerException` which means that the webView is null and not initialized. It happened because it's in Fragment and you're tryign to access it in your Activity. Share the code where you're accessing it from Fragment, there's the real flaw. – Lalit Fauzdar Jun 23 '20 at 05:10
  • @LalitFauzdar yes bro , the code of webView is in fragment but the and DrawerLayout code is in MainActivity. thats why i am asking . i have to added onBackPressed() in fragment, But it says you can either use method in MainActivity or in Fragment. but i have to use if for DrawerLayout and also for webView ... – Sanket Bhosale Jun 23 '20 at 05:25
  • I understood this but what I said is how are you accessing the Fragment's `WebView` in your Class? by directly writing as `webView.canGoBack()`? Because if yes, then that's not how you access other's class's variables. You've to create an object of the Fragment's instance then through that instance you can access the webView, for example - `Fragment fm = (HomeFragment) FragmentManager.childAt(postition);` `fm.webView.canGoBack()`. This is sample code but this is how you create an object and access its entities. Share the code where you're creating and inflating the `Fragment` in `Activity`. – Lalit Fauzdar Jun 23 '20 at 05:32
  • @LalitFauzdar can you explain me in brief, I am new to android or can paste code here for me in answer. Thank you !!!! – Sanket Bhosale Jun 23 '20 at 05:37
  • 1
    I would've answered by now if you had shared your code but sadly, you didn't even when I asked you explicitly for it. You would have easily solved your problem by searching [`access fragment widgets in activity android`](https://www.google.com/search?q=access+fragment+widget+in+activity&oq=Access+fragment+widget+in+) and you'd have got many answers for that. Have a look at [this](https://stackoverflow.com/questions/24188050/how-to-access-fragments-child-views-inside-fragments-parent-activity) question and the answers, you'll find your answer. – Lalit Fauzdar Jun 23 '20 at 06:02

0 Answers0