博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hybrid小技巧:通过js调用原生对话框(Android)
阅读量:7091 次
发布时间:2019-06-28

本文共 3964 字,大约阅读时间需要 13 分钟。

在web开发中,我们会经常使用到Alert、Confirm、Prompt等对话框,但是web自带的对话框又很丑,很多时候我们不得不自己写一些弹窗或者用一些第三方库来实现,但是在Hybrid开发中,我们可以通过一些简单操作,在web页面用js调用原生的对话框,让web页面更接近原生体验。

先看看效果吧

下面看看具体是怎么实现的

assets文件夹下面新建一个index.html

    

通过JS调用三种不同的原生对话框

Alert对话框

Confirm对话框

Prompt对话框

复制代码

WebView布局

复制代码

新建一个prompt_view布局

复制代码

加载web页面到webview

wView = (WebView) findViewById(R.id.wView);//获得WebSetting对象,支持js脚本,可访问文件,支持缩放,以及编码方式WebSettings webSettings = wView.getSettings();webSettings.setJavaScriptEnabled(true);webSettings.setAllowFileAccess(true);webSettings.setBuiltInZoomControls(true);webSettings.setDefaultTextEncodingName("UTF-8");//设置WebChromeClient,处理网页中的各种js事件wView.setWebChromeClient(new MyWebChromeClient());wView.loadUrl("file:///android_asset/index.html");复制代码

自定义一个类实现WebChromeClient类,并重写三种不同对话框

//分别重写onJsAlert,onJsConfirm,onJsPrompt方法    class MyWebChromeClient extends WebChromeClient {        @Override        public boolean onJsAlert(WebView view, String url, String message,                                 final JsResult result) {            //创建一个Builder来显示网页中的对话框            new Builder(MainActivity.this).setTitle("Alert对话框").setMessage(message)                    .setPositiveButton("确定", new OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            result.confirm();                        }                    }).setCancelable(false).show();            return true;        }        @Override        public boolean onJsConfirm(WebView view, String url, String message,                                   final JsResult result) {            new Builder(MainActivity.this).setTitle("Confirm对话框").setMessage(message)                    .setPositiveButton("确定", new OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            result.confirm();                        }                    })                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            result.cancel();                        }                    }).setCancelable(false).show();            return true;        }        @Override        public boolean onJsPrompt(WebView view, String url, String message,                                  String defaultValue, final JsPromptResult result) {            //①获得一个LayoutInflater对象factory,加载指定布局成相应对象            final LayoutInflater inflater = LayoutInflater.from(MainActivity.this);            final View myview = inflater.inflate(R.layout.prompt_view, null);            //设置TextView对应网页中的提示信息,edit设置来自于网页的默认文字            ((TextView) myview.findViewById(R.id.text)).setText(message);            ((EditText) myview.findViewById(R.id.edit)).setText(defaultValue);            //定义对话框上的确定按钮            new Builder(MainActivity.this).setTitle("Prompt对话框").setView(myview)                    .setPositiveButton("确定", new OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            //取得输入的值,传给网页处理                            String value = ((EditText) myview.findViewById(R.id.edit)).getText().toString();                            result.confirm(value);                        }                    })                    .setNegativeButton("取消", new OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            result.cancel();                        }                    }).show();            return true;        }    }复制代码

其实原理很简单,就是自定义一个类实现WebChromeClient类,并重写三种不同对话框的处理方法

从html的js代码可以看,我们在web中只写了最简单的js语法,没有其他任何处理,所以这种实现还得Android配合。

最后送上源码:

转载地址:http://qsiql.baihongyu.com/

你可能感兴趣的文章
JavaScript 函数参数传递到底是值传递还是引用传递
查看>>
LeetCode:105_Construct Binary Tree from Preorder and Inorder Traversal | 根据前序和中序遍历构建二叉树 | Medium...
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
转 用 Chrome 运行Android应用
查看>>
编程心得--不积跬步无以至千里
查看>>
thinkphp学习笔记8—命名空间
查看>>
在项目中几个需要学习的知识
查看>>
验证码安全问题汇总
查看>>
LINK : fatal error LNK1104
查看>>
WPF动态加载3D 放大-旋转-平移
查看>>
大型企业的渗透思路
查看>>
strace命令(收集整理,常看常新)
查看>>
Eclipse Console 加大显示的行数和禁止错误弹出
查看>>
$(document).height()与$(window).height()区别
查看>>
oracle字符集与客户端
查看>>
java线:辛格尔顿隐藏ThreadLocal实现线程数据共享
查看>>
MassTransit RabbitMQ 参考文档
查看>>
android 49 广播接收者中启动其他组件
查看>>
MySQL索引原理及慢查询优化
查看>>
JNI开发示例
查看>>