2

I am using Navigation drawer activity and have 5 fragments, each and every fragment uses WebView to open webpage. Before I was using just one MainActivity which just opened one site and was able to go back to previous opened page easily but now I can't find anything that will let me do this. I am using this code currently in my fragments, I am using the code to go back from here and whenever I open a fragment, app just force-closes.

package com.science.s11;

import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

public class ask extends Fragment {

public WebView mWebView;

public ProgressBar progressBar;
public LinearLayout layoutProgress;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.ampproject, container, false);
    mWebView = (WebView) v.findViewById(R.id.aboutuswebViewask);
    progressBar = (ProgressBar) v.findViewById(R.id.progressBarask);
    layoutProgress = (LinearLayout) v.findViewById(R.id.layoutProgressask);
    mWebView.setVisibility(View.GONE);
    mWebView.setOnKeyListener(new View.OnKeyListener()
    {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if(event.getAction() == KeyEvent.ACTION_DOWN)
            {
                WebView webView = (WebView) v;

                switch(keyCode)
                {
                    case KeyEvent.KEYCODE_BACK:
                        if(webView.canGoBack())
                        {
                            webView.goBack();
                            return true;
                        }
                        break;
                }
            }

            return false;
        }
    });
    mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    WebSettings settings = mWebView.getSettings();
    settings.setSupportMultipleWindows(true);
    settings.setBuiltInZoomControls(false);
    settings.setSupportZoom(false);
    settings.setDisplayZoomControls(false);
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            mWebView.setVisibility(View.VISIBLE);
            layoutProgress.setVisibility(View.GONE);
            progressBar.setIndeterminate(true);
            super.onPageFinished(view, url);

        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            layoutProgress.setVisibility(View.VISIBLE);
            progressBar.setIndeterminate(false);
            super.onPageStarted(view, url, favicon);
        }


    });



    if (isOnline()) {
        mWebView.loadUrl("http://google.com");
    } else {
        mWebView.loadUrl("file:///android_asset/cti.html");
    }
    return v;
}

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return (netInfo != null && netInfo.isConnected());
}}

Can you guys please help me?

Community
  • 1
  • 1
aj20010319
  • 104
  • 1
  • 3
  • 13

3 Answers3

2

Try this, its simple and works fine.

In all of your 5 Fragments, set the variable to public static:

public static WebView mWebView;

In your Mainactivity:

@Override
public void onBackPressed() {
    if (Fragment_1.mWebView!= null) {
        if (Fragment_1.mWebView.canGoBack()) {
            Fragment_1.mWebView.goBack();
        } else {
           // do when mWebView cant go back anymore
        }
    }
    if (Fragment_2.mWebView!= null){
        if (Fragment_2.mWebView.canGoBack()) {
            Fragment_2.mWebView.goBack();
        } else {
             // do when mWebView cant go back anymore
        }
    }
    if (Fragment_3.mWebView!= null){
        if (Fragment_3.mWebView.canGoBack()) {
            Fragment_3.mWebView.goBack();
        } else {
             // do when mWebView cant go back anymore
        }
    }
    if (Fragment_4.mWebView!= null){
        if (Fragment_4.mWebView.canGoBack()) {
            Fragment_4.mWebView.goBack();
        } else {
            // do when mWebView cant go back anymore
        }
    }
     //and so on......
}
aj20010319
  • 104
  • 1
  • 3
  • 13
meitscha
  • 44
  • 2
  • I found that it's not actually necessary to check if mWebView is null, at least it worked for me without that. – aj20010319 Aug 09 '16 at 11:05
0

Try this:

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (mWebView.canGoBack()) {
                    mWebView.goBack();
                } else {
                    finish();
                }
                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}
Jas
  • 3,207
  • 2
  • 15
  • 45
0

you can make a base fragment like this

public abstract class BaseFragments extends Fragment {

abstract public int setContentView();

public void replaceFragment(Context context, Fragment fragment) {
    ((BaseActivity) context).getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, fragment).commit();
}

@Override
public void onResume() {

    super.onResume();
    // preferencesUtility.setuserData(context, userdata);
    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP
                    && keyCode == KeyEvent.KEYCODE_BACK) {

                // Toast.makeText(context, "clicked", Toast.LENGTH_LONG)
                // .show();
                backPressed();

                return true;

            }

            return false;
        }

    });
}


protected abstract void backPressed();

}

and override onBackPressed()in your fragment something like this

public class TestFragment extends BaseFragments {

@Override
public int setContentView() {
    return R.layout.weblayout;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.weblayout, container, false);

    cabmoneyview = (WebView) rootView.findViewById(R.id.webview);

    return rootView;
}

@Override
protected void backPressed() {
    // TODO Auto-generated method stub

}

}

Rahul Chaudhary
  • 1,059
  • 1
  • 6
  • 15