onBackPressed() 使我的 webview 应用程序崩溃

onBackPressed() crashes my webview app

我是 android 开发的新手,我试图重写 onBackPress() 来实现 webView.GoBack()。但是在按下返回键时,我的应用程序崩溃了。这是我的 MainActivity.java 代码。我做错了什么吗??

public class MainActivity extends AppCompatActivity {

private WebView webview;

    /** Called when the activity is first created. */

    public void onBackPressed (){

        if (webview.isFocused() && webview.canGoBack()) {
                webview.goBack();
        }
        else {
               super.onBackPressed();

        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView view = (WebView) findViewById(R.id.webView);

        view.getSettings().setJavaScriptEnabled(true);

        view.setWebViewClient(new MyCustomWebViewClient());
        view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);


        view.loadUrl("http://url");


    }



    private class MyCustomWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

           view.loadUrl(url);
            return true;
        }


        @Override
        public void onPageFinished(WebView view, String url) {
            //hide loading image
            findViewById(R.id.imageLoading1).setVisibility(View.GONE);
            //show webview
            findViewById(R.id.webView).setVisibility(View.VISIBLE);
        }


        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            if (view.canGoBack()) {
                view.goBack();
            } else {
                view.loadUrl("file:///android_asset/index.html");
            }
            Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show();
        }

    }


}

就因为你的webView是空的。您没有在任何地方引用它。修改了你的代码。

public class MainActivity extends AppCompatActivity { 

private WebView view;

    /** Called when the activity is first created. */ 

    public void onBackPressed (){ 

        if (view.isFocused() && view.canGoBack()) {
            view.goBack();
        } 
        else { 
            super.onBackPressed(); 
        } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = (WebView) findViewById(R.id.webView);

        view.getSettings().setJavaScriptEnabled(true);

        view.setWebViewClient(new MyCustomWebViewClient());
        view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);


        view.loadUrl("http://url");


    } 



    private class MyCustomWebViewClient extends WebViewClient {
        @Override 
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

           view.loadUrl(url);
            return true; 
        } 


        @Override 
        public void onPageFinished(WebView view, String url) {
            //hide loading image 
            findViewById(R.id.imageLoading1).setVisibility(View.GONE);
            //show webview 
            findViewById(R.id.webView).setVisibility(View.VISIBLE);
        } 


        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            if (view.canGoBack()) {
                view.goBack();
            } else { 
                view.loadUrl("file:///android_asset/index.html");
            } 
            Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show();
        } 

    } 
} 

onCreate 你有:

WebView view = (WebView) findViewById(R.id.webView);

您在顶部定义的 WebView 尚未初始化,并且是 onBackPressed 方法正在使用的 WebView,要解决此问题,您需要做的就是在初始化之前删除 WebView onCreate 中的变量:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    view = (WebView) findViewById(R.id.webView);

    view.getSettings().setJavaScriptEnabled(true);

    view.setWebViewClient(new MyCustomWebViewClient());
    view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);


    view.loadUrl("http://url");


}

其实你不能直接在fragment里面做。 onBackPressed 可以在 FragmentActivity 中被覆盖。您可以做的是:

1.Override the onBackPressed inside the activity.
2.When the onBackPressed is called, check if the instance of the current fragment is the instance showing the webview.
3.If it is, ask the fragment if the webview can go back.
4.If it is not, call the super or whatever you need

 @Override
 public void onBackPressed() {
   Fragment webview = getSupportFragmentManager().findFragmentByTag("webview");
   if (webview instanceof MyWebViewFragment) {
          boolean goback = ((MyWebViewFragment)webview).canGoBack();
          if (!goback)
            super.onBackPressed();
   }
 }