Day17-WebView

Webview的概念

WebView 是一个用来显示网页的控件,和使用系统其他控件没什么区别, WeView 是微型浏览器。它包含一个浏览器该有的基本功能,例如:前进、后退下一页、搜索、和网页互相调用等功能。

为什么学习Webview????

最大的优势是迭代方便, 只需要修改服务端网页的代码,Android应用就会同步更新。

WebView的缺点:

没有原生控件流畅,用户体验相对较差。

一,WebView使用步骤

1、添加网络权限

<manifest>  
    <uses-permission android:name="android.permission.INTERNET" />   
</manifest>  

2、在 应用文件的Layout中添加一个控件WebView:

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

3、在 Activity 拿到实例化WebView 控件:

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

4、使用 WebView 加载网页

webView.loadUrl("http://keithxiaoy.com");
//加载本地assets目录下的网页
webView.loadUrl("file:///android_asset/keithxiaoy.html");
//加载手机本地的html页面
wwebView.loadUrl("file:///sdcard /taobao.html")

二,WebView 中网页的前进, 后退, 停止,刷新

WebSettings

设置WebView的一些属性。例如允许Android与js互调,允许使用缓存,允许使用内置的缩放组件等。

WebSettings webSettings = mWebView.getSettings();//获取websSetting。
webSettings.setJavaScriptEnabled(true); // 支持Js调用原生。
 // 开启DOM缓存,默认状态下是不支持LocalStorage的 webSettings.setDomStorageEnabled(true); // 开启数据库缓存 webSettings.setDatabaseEnabled(true);   // 支持自动加载图片 
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 支持启用缓存模式

WebViewClient

WebViewClient主要用来处理请求事件和在合适的时候回调进行一些逻辑处理。

  onPageStarted(WebView view, String url, Bitmap favicon):WebView 开始加载页面时回调,一次Frame加载对应一次回调。 
  onLoadResource(WebView view, String url):WebView 加载页面资源时会回调,每一个资源产生的一次网络加载,除非本地有当前 url 对应有缓存,否则就会加载。 
  shouldInterceptRequest(WebView view, String url):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。 
  shouldInterceptRequest(WebView view, android.webkit.WebResourceRequest request):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。 
  shouldOverrideUrlLoading(WebView view, String url):是否在 WebView 内加载页面。 
  onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):WebView ssl 访问证书出错,handler.cancel()取消加载,handler.proceed()对然错误也继续加载。 
  onPageFinished(WebView view, String url):WebView 完成加载页面时回调,一次Frame加载对应一次回调。 
  onReceivedError(WebView view, int errorCode, String description, String failingUrl):WebView 访问 url 出错。

WebChromeClient

辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度,实现更好的展示效果
在这里插入图片描述

Android与Js如何交互?

①android如何调用js。
调用形式:
1,websetting.setJavaScriptEnable(true) 让android和js可以互相调用。
2, mWebView.loadUrl(“javascript:wave()”);
其中wave()是js中的一个方法。
②js如何调用android。
1,websetting.setJavaScriptEnable(true) 让android和js可以互相调用。
2,实现一个Java类,类中方法使用注解@JavascriptInterface。
3、使用系统webview方法 addJavascriptInterface 注入 java 对象来让js调用我们注解的方法。
4,在js中就可以调用Java类注解的方法。
代码中的“demo”是在android中指定的调用名称,即
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), “demo”);
调用形式:

<br/>
<input type="button"  value="调用java代码,且无参" onclick="window.android.noParameterFunction()" />
<br/>
<input type="button"  value="调用java代码,且有参" onclick="window.android.parameterFunction('JS->android 有参成功')"/>

代码中的clickOnAndroid()是“demo”对应的对象:new DemoJavaScriptInterface() 中的一个方法。

代码及效果

在这里插入图片描述

public class LoadActivity extends AppCompatActivity implements View.OnClickListener {
    private Button b1,b2,b3,b4;
    private WebView webView;
    private ProgressBar progressBar;
    private String url = "https://www.qb5200.tw/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_load2);
        initView();
        initWebView();
    }

    private void initWebView() {
        webView.loadUrl(url);
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                progressBar.setVisibility(View.GONE);
            }
        });

        webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                progressBar.setProgress(newProgress);
            }
        });
    }

    private void initView() {
        progressBar = findViewById(R.id.progress);
        b1 = findViewById(R.id.btn_go);
        b2 = findViewById(R.id.btn_back);
        b3 = findViewById(R.id.btn_refresh);
        b4 = findViewById(R.id.btn_stop);
        webView = findViewById(R.id.webView);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        b3.setOnClickListener(this);
        b4.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_go:
                forgo();
                break;
            case R.id.btn_back:
                back();
                break;
            case R.id.btn_refresh:
                refresh();
                break;
            case R.id.btn_stop:
                stop();
                break;
        }
    }

    private void stop() {
        webView.stopLoading();
    }

    private void refresh() {
        webView.reload();
    }

    private void back() {
        if (webView.canGoBack()){
            webView.goBack();
        }else{
            super.onBackPressed();
        }
    }

    private void forgo() {
        if (webView.canGoForward()){
            webView.goForward();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值