webView是一个网络视图,能加载显示网页,可以将其视为一个浏览器。在使用的过程中需要加入网络权限。
【想看源码点这里】
以下是整理的webView的基础使用
- webView加载Url (加载url将页面显示到App上,点击时不会跳到浏览器)
- webView显示页面的title (加载url,切换网页会动态显示title)
- webView调用JAVA方法 (点击页面按钮,将页面输入框的内容传到App界面的TextView中)
- webView调用Js方法 (点击App按钮,将App的EditText中的内容传到页面的输入框中)
1.开发准备
(1)在AndroidManifest.xml中开启权限
<!--上网权限-->
<uses-permission android:name="android.permission.INTERNET" />
2.开始写代码啦
(1)调用Url
加载url将页面显示到App上,点击时不会跳到浏览器
页面代码,webview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WebView的简单使用"/>
<WebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"></WebView>
</RelativeLayout>
Activity代码
public class WebViewByURL extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
webView = findViewById(R.id.myWebView);
webView.loadUrl("https://www.baidu.com");
//重回下面俩个方法,就会在App中打开页面,而不是跳转到浏览器
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
}
});
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
});
}
}
(2)显示Url的Title
加载url,切换网页会动态显示title
界面布局,webview1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/relative"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@color/colorPrimaryDark">
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:text="返回" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:textColor="#ffffff"
android:gravity="center"
android:textSize="20sp"/>
<Button
android:id="@+id/btn_refresh"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:text="刷新" />
</RelativeLayout>
<WebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_weight="1" />
</LinearLayout>
Activity方法
在加载Url的基础上,修改 webView.setWebChromeClient(new WebChromeClient(){});
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onReceivedTitle(WebView view, final String title) {
Log.e("WebViewTitle","title==="+title);
if(!TextUtils.isEmpty(title)){
textView.setText(title);
}else{
textView.setText("获取失败");
}
super.onReceivedTitle(view, title);
}
});
(3)调用Java方法
点击页面按钮,将页面输入框的内容传到App界面的TextView中
开发步骤:
1.允许WebView加载js
webView.getSettings().setJavaScriptEnabled(true);
2.编写js接口类
3.给WebView添加js接口
webView.addJavascriptInterface(obj,name);
界面布局,webview2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="test"/>
<WebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="10dp"/>
</LinearLayout>
html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebView</title>
<style type="text/css">
body {
background: #e3e7fd;
}
.btn {
line-height: 40px;
margin: 10px;
background: #cccccc;
}
</style>
</head>
<body>
<h2>WebView</h2>
<span>请输入要传入的值</span>
<div>
<input type="text" id="input">
</div>
<div id="btn">
<span class="btn">点我</span>
</div>
<script type="text/javascript">
/* 点击webView中的按钮之后,将输入框的内容显示到原生app的textView中 */
var btnEle = document.getElementById("btn");
var inputEle = document.getElementById("input");
btnEle.addEventListener("click", function(){
var str = inputEle.value;
/* alert(str) */
if(window.ImoocJsInterface){
ImoocJsInterface.setValue(str);
}else{
alert("ImoocJsInterface找不到,可能不存在");
}
});
<!-- webView的js调用-->
var remote = function(str){
inputEle.value=str;
}
</script>
</body>
</html>
Activity代码
public class WebViewByJava extends AppCompatActivity implements JsBridge {
// private static String base_url="http://lj1757620885.6655.la:54746/huashengke/";
private WebView webView;
private TextView textView;
private Handler myHandler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview2);
//初始化
initWidgets(savedInstanceState);
//主线程和页面加载线程不一样
Log.e("MainActivity","onCreate");
}
private void initWidgets(Bundle savedInstanceState) {
webView = findViewById(R.id.myWebView);
textView = findViewById(R.id.tv_result);
myHandler = new Handler();
//1.允许WebView加载js的代码
webView.getSettings().setJavaScriptEnabled(true);
//2.编写js接口类--创建接口类,写接口方法
//3.给WebView添加js接口
webView.addJavascriptInterface(new ImoocJsInterface(this),"ImoocJsInterface");
webView.loadUrl("file:///android_asset/index.html");
}
//实现JsBridge的方法
@Override
public void setTextViewValue(final String value) {
//通过handle将页面的value值传到主线程
myHandler.post(new Runnable() {
@Override
public void run() {
textView.setText(value);
}
});
}
}
(4)调用Js方法
点击App按钮,将App的EditText中的内容传到页面的输入框中
开发步骤:
使用loadUrl方法调用javascript 【 webView.loadUrl(javascript:jsString);】
jsString是调用js代码的字符串
页面布局同上
界面布局,webview3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:hint="test"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"/>
<WebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="10dp"/>
</LinearLayout>
Activity代码
public class WebViewByJs extends AppCompatActivity {
private WebView webView;
private EditText editText;
private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview3);
initWidgets(savedInstanceState);
}
private void initWidgets(Bundle savedInstanceState) {
webView = findViewById(R.id.myWebView);
editText = findViewById(R.id.edit);
button = findViewById(R.id.button);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/index.html");
//点击按钮之后,将EditText的内容传到webView的输入框中
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String str = editText.getText().toString().trim();
//''或者\""
webView.loadUrl("javascript:if(window.remote){window.remote('"+str+"')}");
}
});
}
}
3.补充
调用java方法时,将页面输入框的内容显示到App组件上,要注意线程问题。
可以通过log看一下,是在不同的线程,若想达到目的,可以通过Handle处理。
4.界面
(1)(2)加载url,动态修改title
(3)java调用
(4)Js调用