Android之WebView

使用WebView浏览网页

WebView的用法与普通的ImageView相似,提供了大量的方法来执行浏览操作,如:

  • void goback():后退
  • void goForward():前进
  • void loadUrl(String url):加载指定Url对应的网页
  • boolean zoomln():放大网页
  • boolean zoomOut():缩小网页

迷你浏览器

     browser.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyBrower">
    <WebView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

    MyBrower.java


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyBrower extends AppCompatActivity {
    WebView wv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_browser);
        String url = getIntent().getStringExtra("url");
        if(url.isEmpty()){
            url="http://www.baidu.com";
        }
        go(url);
    }
    public void go(String url){
        wv = (WebView)findViewById(R.id.show);
        wv.loadUrl(url);
        wv.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
               view.loadUrl(url);
                return true;
            }
        });

    }
}

如图所示:
这里写图片描述

使用WebView可加载HTML5

WebView提供了一个loadDataWithBAseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)方法,用于加载并显示HTML代码。该方法是ladData(String data,String mimeType,String encoding)的增强版,修复了之前会产生乱码的问题,其中

  • data:指定需要加载的HTML代码
  • mimeType:指定HTML代码的MIME类型,对于HTML可以指定为text/html
  • encoding:指定HTML代码编码所需要的字符集。

具体步骤如下(前提:本地Html5存放到assets文件夹下)

一:使用WebView加载Html5,简单显示
1:清单文件中添加访问权限:android.permission.INTERNET,否则会出现Web page not available错误
2:Activity中生成WebView组件,布局文件中添加控件,或者动态添加
3:本地文件html5中有js的话,webview必须设置支持js的属性:webview.getS它属性,随后附上
4:使用WebView加载html5文件 :webView.loadUrl(“file:///android_asset/XX.html”);

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.webkit.WebView;
public class ViewHtml extends Activity {
  WebView show;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_html);
    //获取程序中的WebView组件
    show = (WebView) findViewById(R.id.show);
    StringBuilder sb = new StringBuilder();
    //拼接一段HTML代码
    sb.append("<html>");
    sb.append("<head>");
    sb.append("<title>欢迎你</title>");
    sb.append("</head>");
    sb.append("<body>");
    sb.append("<h2>欢迎你访问<a href=\"http://www.crazyit.org\">"
            +"疯狂Java联盟</a></h2>");
    sb.append("</body>");
    sb.append("</html>");
    //使用简单的loadData方法会导致乱码,可能是Android API的Bug
    //show.loadData(sb.toString(), "text/html", "utf-8");
    //加载、并显示HTML代码
    show.loadDataWithBaseURL(null,sb.toString(), "text/html", "utf-8", null);
  }
}

二:WebView与html5之间的交互
<1>js调用Android中的函数
1:webView.addJavascriptInterface(obj,str);
参数一:android中的实例对象
参数二:js中别名
注:如果js中调用此对象的某方法,须在此公有方法前加上注解@JavascriptInterface,否则访问不了,目前只知道这种写法只能调用对象的方法。
如果不加webView.setWebChromeClient()这个方法,js中的alert对话框将不会提示。
2:js中使用str.xx()/window.str.xx()调用android中的方法
(Android中的list须转换成json的字符串形式传入到js中,用eval(json)进行获取)
<2>anroid中调用js的方法
1:js中编写带参或不带参的方法 如function init(){alert(“js中方法显示”);}
2:用webView.loadUrl(“JavaScript:init()”);进行调用显示即可
三:webView加载html5全屏显示解决办法
1:

<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,initial-scale=1.0" user-scalable=no />

四:webView的属性(必要的)

  • myWebView.getSettings().setJavaScriptEnabled(true);//可以使用js
  • myWebView.getSettings().setDefaultTextEncodingName(“GBK”);//设置编码格式
  • myWebView.setWebViewClient(newWebViewClient());//限制在webview中打开网
    页,不用默认浏览器
  • myWebView.getSettings().setBuiltInZoomControls();
    //设置是否支持缩放
  • myWebView.addJavascriptInid4.2之前并未限制此方法,根据java反射机制造成攻击,所以在此版本之后则限制了js对java对象方法调用的权限(必须声明注解公共的方法才能被页面调用)

<html>
    <body>
    <br><br>
    <a><h1>js中调用本地方法</h1></a>
    <script>
        function sayHello()
        {
             alert("Hello")
         }
         vak', function(){
        //调用android本地方法
            control.toastMessage("js中调用本地方法");
             return false;
          }, false);
    </script>
    </body>
</html>
public class MainActivity extends AppCompatActivity {
    private Button btnShow;
    private WebView webView;

    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initEvent();
    }

    private void initView() {
        btnShow = (Button) findViewById(R.id.btn_show);
        webView = (WebView) findViewById(R.id.webView);
    }

    private void initData() {
        webView.setWebChromeClient(new WebChromeClient());
        WebSettings set = webView.getSettings();
        //设置webview支持js
        set.setJavaScriptEnabled(true);
        //设置本地调用对象及其接口
        webView.addJavascriptInterface(new JsInteraction(), "control");
        webView.loadUrl("file:///android_asset/test.html");
    }

    private void initEvent() {
        btnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //本地调用js方法
                webView.loadUrl("javascript:sayHello()");
            }
        });
    }

    public class JsInteraction {
        @JavascriptInterface  
        public void toastMessage(String message) { 

  //提给js调用的方法
            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
        }
    }
}

结果如图:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值