首页 > 其他分享 >Android 嵌入 Html

Android 嵌入 Html

时间:2024-08-05 16:42:19浏览次数:7  
标签:Toast 嵌入 JavaScript Html webView Android WebView 加载

Android 嵌入 Html

在 Android 应用中嵌入 HTML 内容通常使用 WebView 组件来实现。WebView 是一种允许你在应用中显示网页内容的视图。

使用

准备html文件

<!-- //将html文件放入与java、res同级目录assets目录下 -->
<!-- src/main/assets/assets.html -->
<html>
<head>
    <title>My HTML Page</title>
    <script type="text/javascript">
        function callAndroidFunction() {
            // 调用 Android.showToast 方法,这个方法由 Android 端提供,用于显示 Toast 消息。
            Android.showToast("hello,this is from JavaScript");
        }
         function myJavaScriptFunction() {
            // 这里是JavaScript函数的实现
            alert("Hello from JavaScript function!");
            return "This is the data returned by javasrcipt."
        }
    </script>
</head>
<body>
<h1>Hello, WebView</h1>
<p>这是一个html界面</p>
<form>
    <table>
        <tr>
            <td><input></td>
            <td><input></td>
            <td><input></td>
        </tr>
        <tr>
            <td><input></td>
            <td><input></td>
            <td><input></td>
        </tr>
    </table>
</form>
<button onclick="callAndroidFunction()">提示</button>
</body>
</html>

添加 WebView 到布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:text="确定"
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <WebView
        android:layout_below="@id/btn"
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

在活动(Activity)中配置 WebView

public class MainActivity extends AppCompatActivity {

    private   WebView webView;
    @SuppressLint({"SetJavaScriptEnabled", "JavascriptInterface"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        // 启用 JavaScript 支持,使得 WebView 可以执行 HTML 中的 JavaScript 代码。
        webView.setWebViewClient(new WebViewClient());
       //这是一个用于处理 WebView 中的网页加载过程的客户端
        webView.setWebChromeClient(new WebChromeClient());
        //这是一个用于处理与网页渲染相关的客户端
        webView.addJavascriptInterface(new WebAppInterface(this), "Android");
        // 将WebAppInterface对象添加到WebView中,并将其暴露给JavaScript代码,名称为"Android"。这样JavaScript可以调用WebAppInterface中的方法。
        webView.loadUrl("file:///android_asset/sample.html");
        //加载指定的 URL 到 WebView 中

        Button btn=findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
			  // 执行 JavaScript 函数 myJavaScriptFunction 并获取其返回值。
                webView.evaluateJavascript("javascript:myJavaScriptFunction()", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        // 处理 JavaScript 代码执行的结果
                        System.out.println(value);
                        Toast.makeText(MainActivity.this, value, Toast.LENGTH_SHORT).show();
                    }
                });
                loadJavaScriptToGetTableData();
            }
        });
    }
    // 加载JavaScript代码以获取表格数据
    private void loadJavaScriptToGetTableData() {
        webView.evaluateJavascript(
                "(function() {" +
                        "   var tableData = [];" +
                        "   var table = document.getElementsByTagName('table')[0];" +
                        "   var rows = table.getElementsByTagName('tr');" +
                        "   for (var i = 0; i < rows.length; i++) {" +
                        "       var cells = rows[i].getElementsByTagName('td');" +
                        "       var rowData = [];" +
                        "       for (var j = 0; j < cells.length; j++) {" +
                        "           var input = cells[j].getElementsByTagName('input')[0];" +
                        "           rowData.push(input.value);" + // 使用 input.value 获取输入框的值
                        "       }" +
                        "       tableData.push(rowData);" +
                        "   }" +
                        "   return JSON.stringify(tableData);" +
                        "})()",
                new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        // 在这里处理JavaScript代码返回的表格数据
                        String tableDataJson = value;
                        Toast.makeText(MainActivity.this, "Table Data: " + tableDataJson, Toast.LENGTH_SHORT).show();
                        System.out.println(tableDataJson);
                    }
                }
        );
    }
    //WebAppInterface: 内部类,用于实现 Java 和 JavaScript 之间的交互。
    public class WebAppInterface {
        private MainActivity mContext;

        WebAppInterface(MainActivity c) {
            mContext = c;
        }
        //showToast 方法可以从 JavaScript 被调用,用于显示 Toast 消息。
        @JavascriptInterface
        public void showToast(String message) {
            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
        }
    }
    @Override
	//在活动注销时注销webview防止内存泄露
    protected void onDestroy() {
        super.onDestroy();
        webView.destroy();
    }
}

总结

Android WebView控件是Android开发中用于展示网页内容的一个非常强大的组件。它允许开发者在自己的应用中嵌入一个完整的浏览器环境,用于加载和显示网页。使用WebView,开发者可以为用户提供丰富的网络内容体验,同时保持应用的原生外观和感觉。以下是对Android WebView控件使用的一个总结:

.基本使用

  • 添加WebView到布局文件:首先,需要在XML布局文件中添加WebView控件。

  • 在Activity中配置WebView:在Activity的onCreate方法中,通过findViewById获取WebView实例,并配置其属性,如启用JavaScript支持、设置WebViewClient和WebChromeClient等。

. 常用的WebViewClient和WebChromeClient

  • WebViewClient:用于处理各种通知和请求事件,如页面开始加载、页面加载完成、页面加载失败等。

  • WebChromeClient:用于处理与渲染相关的回调,如进度条更新、JS弹窗等。

注意事项

  • 内存泄漏:WebView可能会导致内存泄漏,特别是在Activity被销毁时,如果WebView还持有Activity的引用。因此,在Activity的onDestroy方法中,应该调用webView.destroy()来释放WebView占用的资源。
  • 硬件加速:从Android 3.0(API级别 11)开始,WebView默认启用硬件加速。但在某些情况下,如果WebView表现异常(如渲染问题),可以尝试关闭硬件加速。
  • 安全性:加载不受信任的网页时,需要注意安全性问题,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。确保服务器端的防护措施完善,并避免在WebView中加载敏感信息。
  • 性能优化:对于复杂的网页或应用,WebView的性能可能会受到影响。可以通过优化网页的加载内容、减少DOM操作、缓存策略等方式来提升性能。

高级功能

  • 与JavaScript交互:WebView支持Java与JavaScript之间的交互,可以通过addJavascriptInterface方法实现。
  • 下载文件:通过重写shouldOverrideUrlLoading方法处理下载链接,使用DownloadManager或其他下载方式。
  • 加载本地HTML:使用loadDataloadDataWithBaseURL方法加载本地HTML字符串。

WebView控件为Android应用提供了强大的网页内容展示能力,但也需要开发者注意其使用细节和潜在问题,以确保应用的稳定性和安全性。

代码地址

lxj/EmbeddedInHtml (gitee.com)

标签:Toast,嵌入,JavaScript,Html,webView,Android,WebView,加载
From: https://www.cnblogs.com/20lxj666/p/18343488

相关文章

  • Android开发_android stuido 快捷键
    Alt+回车导入包,自动修正Ctrl+N查找类Ctrl+Shift+N查找文件Ctrl+Alt+L格式化代码Ctrl+Alt+O优化导入的类和包Alt+Insert生成代码(如get,set方法,构造函数等)Ctrl+E或者Alt+Shift+C最近更改的代码Ctrl+R替换文本Ctrl+F查找文本Ctrl+Shift+Space自动补全代码......
  • video视频自动播放兼容IOS与Android
    有个需求是自动播放,但是在Android手机上正常播放,在iOS上就不播放在移动设备上,尤其是在iOS设备上,视频的自动播放存在一些限制。为了使视频在iOS设备上自动播放,你需要确保以下几点:确保视频是静音的:iOS设备上,只有静音的视频才能自动播放。你已经设置了muted属性,这是......
  • Android开发 - Movie 类详解
    基本结构Movie类应该包含电影的基本信息。假设我们需要存储以下信息:电影标题(title)电影描述(description)发布年份(releaseYear)评分(rating)海报URL(posterUrl)我们将为这些属性创建一个类!创建Movie类首先定义Movie类并添加相应的属性、构造方法和getter/set......
  • Android 之 PopUpWindow 控件的使用(努力z的日记)
    Gif示例:上面的示例是模仿一些App设置的弹窗,为了实现上面gif中的效果,可以通过PopUpWindow实现。以下是实现过程。(欢迎大佬指证o.o)1:创建PopUpWindow动画(anim)    这个anim是在开发中扮演很重要的一环,因为好看o.o,所以麻烦。浅入浅出是我们比较常见的。(因为周师傅只会......
  • Android R Settings关于屏保/PowerManagerService欺骗系统不让其进入休眠状态
    //屏保设置界面./packages/apps/Settings/src/com/android/settings/dream/DreamSettings.java//和PowerManagerService建立联系./frameworks/base/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java//系统时钟屏保继承了DreamService./package......
  • android10.0(Q) MTK 6765 user版本打开root权限
    前言相比较Android8.1、9.0而言,Android10.0版本的root变得相当麻烦,10.0中引入了动态分区机制,同样的要想完全adbroot,需要fastboot解锁,然后关闭verity才能adbremount成功。我尝试和之前一样修改fstab.in.mt6765中的ro和rw初始值,容易导致无法正常开机,在......
  • (峰绍)FU6831/11/18 QFN-48/LQFP 单片机嵌入式和可配置的三相BLDC/PMSM电机控制器场定向
    产品描述FU6831/11/18系列是一款集成电机控制引擎(ME)和8051内核的电机驱动专用芯片。ME集成FOC、MDU、LPF、PI、SVPWM/SPWM等诸多硬件模块,可硬件自动完成电机FOC/BLDC运算控制;8051内核用于参数配置和日常事务处理,双核并行工作实现各种高性......
  • Android中毛玻璃效果的两种实现
    Android中毛玻璃效果主要有两种实现方式。1.使用JAVA算法FastBlur实现方法1先将图片缩小,然后放大图片,再设置为控件背景以达到更模糊的效果,同时也提升模糊算法的处理效率。2.使用Android自带类RenderScript实现方法2模糊半径只能设置1-25。对比下来同样的模糊半径,方法1的模......
  • 基本的 HTML 标签 - 四个实例
    您已经很好地概述了四个基本的HTML标签实例:HTML标题、HTML段落、HTML链接和HTML图像。这些标签是构建网页时最常用的基础元素。下面我将进一步解释每个实例,并给出一些额外的信息和最佳实践。HTML标题HTML标题通过<h1>到<h6>标签定义,其中<h1>是最高级别的标题,通常用于主标题,而<h......
  • Android activity主题设置
    主题配置<stylename="MainThemeCamera"parent="Theme.AppCompat.DayNight.NoActionBar"><itemname="android:windowBackground">@color/black</item><itemname="android:windowTranslucentStatu......