android - WebView 应用程序在旋转时崩溃将 null onSaveInstanceState 上的异常

标签 android webview

我有一个应用程序可以在 WebView 中加载网页。它可以很好地加载页面,但在旋转时会崩溃,并出现关于 onSaveInstanceState 中的空指针的错误(第 82 行)

package uk.co.grcade.grcade;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

import java.net.URI;
import java.net.URL;

public class MainActivity extends ActionBarActivity {


    private WebView view;

    //Main WebView Panel Start
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState != null)
        {
            //view.restoreState(savedInstanceState);
        } else {

            String url = "http://grcade.co.uk";
            WebView view = (WebView) this.findViewById(R.id.webView);
            view.getSettings().setJavaScriptEnabled(true);
            view.loadUrl(url);
            view.getSettings().setSupportZoom(true);
            view.getSettings().setBuiltInZoomControls(true);
            view.getSettings().setDisplayZoomControls(false);
            view.getSettings().setLoadWithOverviewMode(true);

            view.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return false;
                }
            });

            view.setBackgroundColor(Color.TRANSPARENT);

            view.setDownloadListener(new DownloadListener() {
                public void onDownloadStart(String url, String userAgent,
                                            String contentDisposition, String mimetype,
                                            long contentLength) {
                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i);
                }


            });
        }
    }

    @Override
    public void onSaveInstanceState (Bundle outState)
    {
        super.onSaveInstanceState(outState);
        view.saveState(outState);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        view.restoreState(savedInstanceState);
    }

    //Main WebView Panel End

    //Refresh button on top bar Start
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        WebView view=(WebView) this.findViewById(R.id.webView);

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_refresh){
            view.reload();
        }

        return super.onOptionsItemSelected(item);
    }
    //Refress Button on time bar End

    //Start Back Button Back Page

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView view = (WebView) this.findViewById(R.id.webView);
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
                case KeyEvent.KEYCODE_BACK:
                    if(view.canGoBack()){
                        view.goBack();
                    }else{
                        finish();
                    }
                    return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }

    //End Back Button Back Page


}

我是应用程序的新手,所以对这一切感到很迷茫。 非常感谢任何帮助。

最佳答案

public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // and now set the view variable: 
        this.view = (WebView) findViewById(R.id.webView);
        // not WebView view !
        // ...
}

希望对你有帮助。

问题是您没有设置 View 变量。

编辑:

package uk.co.grcade.grcade;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

import java.net.URI;
import java.net.URL;

public class MainActivity extends ActionBarActivity {


    private WebView view;

    //Main WebView Panel Start
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        view.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });
        view.setDownloadListener(new DownloadListener() {
                public void onDownloadStart(String url, String userAgent,
                                            String contentDisposition, String mimetype,
                                            long contentLength) {
                    Intent i = new Intent(Intent.ACTION_VIEW);
                    i.setData(Uri.parse(url));
                    startActivity(i);
                }


            });

        if(savedInstanceState == null){

            String url = "http://grcade.co.uk";
            view.getSettings().setJavaScriptEnabled(true);
            view.loadUrl(url);
            view.getSettings().setSupportZoom(true);
            view.getSettings().setBuiltInZoomControls(true);
            view.getSettings().setDisplayZoomControls(false);
            view.getSettings().setLoadWithOverviewMode(true);

            view.setBackgroundColor(Color.TRANSPARENT);

        }
    }

    @Override
    public void onSaveInstanceState (Bundle outState)
    {
        super.onSaveInstanceState(outState);
        view.saveState(outState);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        view.restoreState(savedInstanceState);
    }

    //Main WebView Panel End

    //Refresh button on top bar Start
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        WebView view=(WebView) this.findViewById(R.id.webView);

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_refresh){
            view.reload();
        }

        return super.onOptionsItemSelected(item);
    }
    //Refress Button on time bar End

    //Start Back Button Back Page

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView view = (WebView) this.findViewById(R.id.webView);
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
                case KeyEvent.KEYCODE_BACK:
                    if(view.canGoBack()){
                        view.goBack();
                    }else{
                        finish();
                    }
                    return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }

    //End Back Button Back Page


}

关于android - WebView 应用程序在旋转时崩溃将 null onSaveInstanceState 上的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347254/

相关文章:

javascript - Haskell Webviewhs 文本字段并返回到 Haskell

java - 将 fileChooserParams 中的 mime 类型转换为 Intent.setType 的正确格式

android - 两个编辑文本的语音转文本(单个按钮)

Android - 从带条件的sqlite表中获取最大值

android - 在我的 ImageView 中添加一个 "clicked effect"

android - 检查数据库中是否存在值

android - FCM(Firebase 云消息传递)使用 Asp.Net 推送通知

java - Android Webview - 如何仅允许来自硬件键盘的输入?

flutter - 在flutter中从webview中删除html元素

Android WebView opening links in default browser - 在应用程序中打开链接