WebViewClient和onKeyDown的问题

时间:2015-06-02 14:12:17

标签: android webview android-webview onkeydown webviewclient

我目前正在尝试制作基于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”类也在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

2 个答案:

答案 0 :(得分:1)

试试这个

 @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);

答案 1 :(得分:0)

我会省略这句话:

WebView webview = new WebView(this);

您不需要像这样构造WebView,浏览器活动类中的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( )。