WebView的简单使用

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
(1)(2)加载url,动态修改title
(3)java调用
在这里插入图片描述
(4)Js调用
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值