【问题标题】:Problems with WebViewClient and onKeyDownWebViewClient 和 onKeyDown 的问题
【发布时间】:2015-06-02 14:12:17
【问题描述】:

我目前正在尝试制作一个基于 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

【问题讨论】:

    标签: android webview android-webview onkeydown webviewclient


    【解决方案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);
    

    【讨论】:

    • 是的,你是对的。但它仍然崩溃。问题是,当我调用 NewWebClient.此时应用程序仍然崩溃。 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.setWebViewClient(android.webkit.WebViewClient)' on a null object reference
    【解决方案2】:

    我会省略这句话:

    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( )。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2010-11-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多