zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    java上传1t文件
    上传1T文件
    超过20g的文件+上传
    文件批量下载
    下载超大文件的控件
    Java上传大文件夹
    Java超大文件上传解决办法
    vue+大文件上传控件
    cocos2dx3.1 win7安装步骤及编译到安桌
    Muller’s method (website)
  • 原文地址:https://www.cnblogs.com/yangdd/p/13338355.html
Copyright © 2011-2022 走看看