WebView

本文介绍了如何在Android应用中使用WebView加载本地HTML文件和网络URL,设置JavaScript支持,自定义返回键行为,以及使用WebChromeClient监控网页状态。涵盖了网页导航、加载操作和关键API的深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

创建一个名为WebViewActivity的Activity,布局中放一个WebView控件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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=".WebViewActivity">

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

</androidx.constraintlayout.widget.ConstraintLayou

1.加载URL

加载assets下的html文件

webView.loadUrl("file:///android_asset/test.html");

在main目录下新建一个assets Folder
在这里插入图片描述
创建一个简单的html文件用于测试,将其名字命名为test,放入assets目录下

<html>
Hello World!
</html>

直接使用loadUrl方法加载

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        webView = findViewById(R.id.WebView);
//        加载本地html
        webView.loadUrl("file:///android_asset/test.html");

    }
}

加载网络URL

webview.loadUrl("http://m.baidu.com");

由于百度的首页需要js的支持,但是java默认是不支持js的,所以需要设置支持js

 webView.getSettings().setJavaScriptEnabled(true);

完整代码

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        webView = findViewById(R.id.WebView);
//        加载网络url
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("http://m.baidu.com");
    }
}

当在百度首页点击进入其他界面时会弹出一个对话框询问用户需不需要用本地的其他浏览器打开,可以设置继续使用当前的webview打开

webView.setWebViewClient(new MyWebViewClient());

这里需要传入一个WebVIewClient,我们可以写一个内部类继承WebVIewClient

    class MyWebViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            	//不用外部浏览器,直接在当前webview加载网页
                view.loadUrl(request.getUrl().toString());
            }
            return true;
        }
    }

在onCreate方法里加入

webView.setWebViewClient(new MyWebViewClient());

这样就OK啦。

网页开关添加伴随操作

在MyWebViewClient 中重写WebVIewClient的onPageStartedonPageFinished方法,在网页加载和加载完成时执行,这里只是简单的打印一条日志

    class MyWebViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                view.loadUrl(request.getUrl().toString());
            }
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.d("WebView","onPageStarted...");
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d("WebView","onPageFinished...");

        }
    }

重定义按下返回键的作用

默认情况下按下返回键是退出应用,为了实现按下返回键后退的功能,可以重写WebViewActivity的onKeyDown方法:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

设置WebChromeClient

写一个内部类MyChromeClient 继承WebChromeClient

    class MyChromeClient extends WebChromeClient{
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
        	//可以通过这个方法获取加载进度进而实现网页加载的进度条的功能
            super.onProgressChanged(view, newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            //设置webview的标题为网页标题
            setTitle(title);
        }
    }

在onCreate方法中添加语句

webView.setWebChromeClient(new MyChromeClient());

就可以了

还有一个进入网页弹出提示对话框的js写法,这里是在MyWebViewClient 的onPageStarted中写的

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.d("WebView","onPageStarted...");
            //进入网页弹出提示对话框的js写法
            //第一种
//            webView.loadUrl("javascript:alert('hello')");
            //第二种
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//                webView.evaluateJavascript("javascript:alert('hello')",null);
//            }
        }

加载html代码

webview.loadData();
webview.loadDataWithBaseURL();

第二个方法稳定性更好,不容易乱码。

2.网页的前进后退的相关方法

作用就像这些英语的意思一样:

webview.canGoBack();
webview.goBack();
webview.canGoForward();
webview.goForward();
webview.GoBackOrForward(int steps);//正数代表向前,负数代表向后
webview.goBackOrForward(int steps);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值