使用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();
}
}
}
结果如图: