Android开发笔记(十二)——WebView

加载网页

  • 加载URL(网络或者本地assets文件夹下面的html文件)
  • 加载html代码
  • Native和JavaScript相互调用

加载网络URL

webview.loadUrl("http://www.tiantiantech.cn");

加载assets下的html文件

webview.loadUrl("file:///android_asset/test.html");

加载html代码:

  • webview.loadData();
  • webview.loadDataWithBaseURL();

网页的前进后退的方法:

  • webview.canGoBack() :判断当前页面是否还有上一级页面,是否需要返回
  • webview.goBack() :要后退
  • webview.canGoForward() :判断当前页面是否还有下一级页面,是否需要前进
  • webview.goForward() :要前进
  • webview.canGoBackOrForward(int steps) :是否返回或前进,传入的参数为整数,如果是2,表示向前走两步,如果是-2,表示向后退两步
  • webview.goBackOrForward(int steps) :要前进或者后退

点击返回键,默认是退出当前的Activity,如果希望是Webview内网页后退,则要重写Activity中的 onKeyDown 方法:

return true 表示该事件处理完毕。

具体操作

activity_web_view.xml 中写入webview控件,整个屏幕都是webview:

<WebView
    android:id="@+id/wv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

WebViewActivity.java 中添加声明和找到控件:

加载assets下的html文件(加载本地HTML)

在main下新建一个assets folder,如下:

在这个建好的assets folder中放一个写好的HTML文件:

WebViewActivity.java 中添加如下代码:

//加载本地HTML
webview.loadUrl("file:///android_asset/test.html");

其中 file:///android_asset 是得到 assets 目录,接着后面是具体的文件名称。

运行看是否加载该HTML文件:

加载网络URL

WebView加载页面需要js的支持,默认是不支持js的,这里需要在加载网络URL之前进行设置:

//加载网络URL
mWvMain.getSettings().setJavaScriptEnabled(true);
mWvMain.loadUrl("https://m.baidu.com");

现在的效果如下:

但是退出的话不会退出到上一级页面,而是直接退出button

还有就是在搜索的时候会询问使用以下方式打开,这里是因为webview中的跳转默认不是在当前的webview中继续加载,而是要调用浏览器。
希望在webview中继续加载,重写以下方法:

    class MyWebViewClient extends WebViewClient{
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            view.loadUrl(request.getUrl().toString());
            return super.shouldOverrideUrlLoading(view, request);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.d("WebView","onPageStarted!!!!!!!");
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d("WebView","onPageFinished!!!!!!!");
        }
    }

此时 onCreate 函数中的代码如下:

//加载网络URL
mWvMain.getSettings().setJavaScriptEnabled(true);
mWvMain.setWebViewClient(new MyWebViewClient());
mWvMain.loadUrl("https://m.baidu.com");

这时候的效果:

可以看到在搜索框中进行搜索的时候可以顺利进行,不需要用别的浏览器打开。此时进入页面的时候可以再日志中捕捉到信息:什么时候开始加载,什么时候加载成功:

但是此时点击返回键的时候还是会直接返回上一级Activity而不是上级页面。重写Activity中的 onKeyDown 方法:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && mWvMain.canGoBack()){
            mWvMain.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

如果点击的是返回键并且webview可以回退,则回退一级,此时效果入下,可以满足返回上一级页面还没有退出Activity:

接下来重写以下方法来实现加载页面的进度条和title显示:

    class MyWebChromeClient extends WebChromeClient{
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);  //加载网页进度条的功能
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            setTitle(title); //把网页上的title设置到Activity的title上去
        }
    }

在加载网络URL的位置添加:

 mWvMain.setWebChromeClient(new MyWebChromeClient());

运行查看效果:

这里 WebChromeClient.java 中的方法可以实现Hybrid开发,使得Native和JavaScript相互调用(通信)。

Native和JavaScript相互调用

Native执行JavaScript代码

onPageFinished 函数中添加:

mWvMain.loadUrl("javascript:alert('hello')");

这里 mWvMain 调用一句js代码,在页面加载结束后弹出对话框,不是native的对话框,而是js弹出的对话框,效果如下:

还可以使用另一种方法:

mWvMain.evaluateJavascript("javascript:alert('hello')",null);

可以看到同样效果,就不贴图了。

JavaScript调用Native方法

可以使用 addJavascriptInterface() 方法,可以在本地写一些java的方法,然后js就可以调用这些方法,这里没有演示

图粘贴不上来,下面的是有道笔记分享

文档:Android开发笔记(十二)——WebView.m...
链接:http://note.youdao.com/noteshare?id=574fcb56d38301553ddbb9c9de6c716a

posted @ 2020-07-19 00:44  Ylxxxxx  阅读(546)  评论(0编辑  收藏  举报