WebViewClient 和 onKeyDown 的问题

Problems with WebViewClient and onKeyDown

我目前正在尝试制作一个基于 WebView 的应用程序。

这是我目前拥有的代码:

    WebView webview = new WebView(this);
    setContentView(webview);

    WebView webView = (WebView) findViewById(R.id.myWebView);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadsImagesAutomatically(true);

    webView.setWebViewClient(new NewWebViewClient());
    webview.loadUrl("http://google.com");

而"NewWebViewClient"class也在这下面MainActivity.java

public class NewWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        view.loadUrl(url);
        return true;
    }
}

Android Studio 没有显示任何错误。 但是,如果我想在我的智能手机上启动该应用程序,它就会崩溃。

我遇到的同样问题:

public void onKeyDown() {
    WebView webView = (WebView) findViewById(R.id.myWebView);

    if (webView.copyBackForwardList().getCurrentIndex() > 0) {
        webView.goBack();
    }

    else {
        super.onBackPressed();
    }

}

有谁知道我是如何让这两个东西都起作用的?

编辑:

它仍然崩溃:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.setWebViewClient(android.webkit.WebViewClient)' on a null object reference

试试这个

 @Override
public void onBackPressed() {
        WebView webView = (WebView) findViewById(R.id.myWebView);
    if(webView!=null)
               {
                  if(webView.canGoBack())
                    {
                        webView.goBack();
                    }
            else
                {
                  super.onBackPressed();
                }
           }
   }

读完你的问题后,我认为你需要在用户按下后退按钮时执行返回...如果那是你喜欢的可以使用上面的代码...

并替换

 WebView webview = new WebView(this);

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

我会省略这句话:

WebView webview = new WebView(this);

您不需要像那样构建 WebView,浏览器 activity class 中的 onCreate() 事件将负责启动对象。 然后,而不是调用 setContentView() 引用您构建的 webview:

setContentView(webview);

引用包含 WebView 的布局,例如:

setContentView(R.layout.browser);

然后你就可以通过它的id来引用WebView了。 我认为问题是 findViewById() 没有通过 ID 找到 WebView, 因为您之前没有设置包含具有该 ID 的元素的布局。 这是通过 setContentView() 实现的。 FindViewById() 方法需要知道在哪个视图中查找具有特定 ID 的元素,例如,有时您需要先膨胀视图(替代 setContentView):

View  v =  LayoutInflater.from(getApplicationContext()).inflate(R.layout.some_layout, null);

然后针对此视图调用 findViewById 以在布局中查找元素:

v.findViewById(R.id.element_id);

因此,如果您通过 setContentView() 设置视图,请使用不带视图前缀的 findViewById(),首先指向布局,如果您通过 LayoutInflater 扩充视图,请使用 view.findViewById() 语法,而无需使用 setContentView()。