Skip to content

Commit aed267a

Browse files
committed
add JavaScript 弹窗 #53
1 parent fa75890 commit aed267a

File tree

6 files changed

+170
-3
lines changed

6 files changed

+170
-3
lines changed

ByWebView/src/main/java/me/jingbin/web/ByWebChromeClient.java

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@
22

33
import android.annotation.SuppressLint;
44
import android.app.Activity;
5+
import android.app.AlertDialog;
6+
import android.app.Dialog;
7+
import android.content.DialogInterface;
58
import android.content.Intent;
69
import android.content.pm.ActivityInfo;
710
import android.graphics.Bitmap;
811
import android.graphics.BitmapFactory;
912
import android.net.Uri;
1013
import android.os.Build;
14+
import android.os.Message;
1115
import android.text.TextUtils;
12-
import android.util.Log;
16+
import android.view.Gravity;
1317
import android.view.LayoutInflater;
1418
import android.view.View;
19+
import android.view.ViewGroup;
20+
import android.webkit.JsPromptResult;
21+
import android.webkit.JsResult;
1522
import android.webkit.PermissionRequest;
1623
import android.webkit.ValueCallback;
1724
import android.webkit.WebChromeClient;
1825
import android.webkit.WebView;
26+
import android.widget.EditText;
1927
import android.widget.FrameLayout;
2028

2129
import androidx.annotation.Nullable;
@@ -181,6 +189,94 @@ public void onReceivedTitle(WebView view, String title) {
181189
}
182190
}
183191

192+
@Override
193+
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
194+
if (onByWebChromeCallback != null && onByWebChromeCallback.onJsAlert(view, url, message, result)) {
195+
return true;
196+
}
197+
Dialog alertDialog = new AlertDialog.Builder(view.getContext()).
198+
setMessage(message).
199+
setCancelable(false).
200+
setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
201+
@Override
202+
public void onClick(DialogInterface dialog, int which) {
203+
dialog.dismiss();
204+
result.confirm();
205+
}
206+
})
207+
.create();
208+
alertDialog.show();
209+
return true;
210+
}
211+
212+
@Override
213+
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
214+
if (onByWebChromeCallback != null && onByWebChromeCallback.onJsConfirm(view, url, message, result)) {
215+
return true;
216+
}
217+
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
218+
@Override
219+
public void onClick(DialogInterface dialog, int which) {
220+
if (which == Dialog.BUTTON_POSITIVE) {
221+
result.confirm();
222+
} else {
223+
result.cancel();
224+
}
225+
}
226+
};
227+
new AlertDialog.Builder(view.getContext())
228+
.setMessage(message)
229+
.setCancelable(false)
230+
.setPositiveButton(android.R.string.ok, listener)
231+
.setNegativeButton(android.R.string.cancel, listener).show();
232+
return true;
233+
}
234+
235+
@Override
236+
public boolean onJsPrompt(final WebView view, String url, final String message, final String defaultValue, final JsPromptResult result) {
237+
if (onByWebChromeCallback != null && onByWebChromeCallback.onJsPrompt(view, url, message, defaultValue, result)) {
238+
return true;
239+
}
240+
view.post(new Runnable() {
241+
@Override
242+
public void run() {
243+
final EditText editText = new EditText(view.getContext());
244+
editText.setText(defaultValue);
245+
if (defaultValue != null) {
246+
editText.setSelection(defaultValue.length());
247+
}
248+
float dpi = view.getContext().getResources().getDisplayMetrics().density;
249+
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
250+
@Override
251+
public void onClick(DialogInterface dialog, int which) {
252+
if (which == Dialog.BUTTON_POSITIVE) {
253+
result.confirm(editText.getText().toString());
254+
} else {
255+
result.cancel();
256+
}
257+
}
258+
};
259+
new AlertDialog.Builder(view.getContext())
260+
.setTitle(message)
261+
.setView(editText)
262+
.setCancelable(false)
263+
.setPositiveButton(android.R.string.ok, listener)
264+
.setNegativeButton(android.R.string.cancel, listener)
265+
.show();
266+
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
267+
ViewGroup.LayoutParams.MATCH_PARENT,
268+
ViewGroup.LayoutParams.WRAP_CONTENT);
269+
int t = (int) (dpi * 16);
270+
layoutParams.setMargins(t, 0, t, 0);
271+
layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
272+
editText.setLayoutParams(layoutParams);
273+
int padding = (int) (15 * dpi);
274+
editText.setPadding(padding - (int) (5 * dpi), padding, padding, padding);
275+
}
276+
});
277+
return true;
278+
}
279+
184280
//扩展浏览器上传文件
185281
//3.0++版本
186282
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {

ByWebView/src/main/java/me/jingbin/web/ByWebView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ public Builder addJavascriptInterface(String interfaceName, Object interfaceObj)
461461
}
462462

463463
/**
464-
* @param onTitleProgressCallback 返回Title Progress
464+
* @param onTitleProgressCallback 返回Title Progress ,横竖屏和弹框
465465
*/
466466
public Builder setOnTitleProgressCallback(OnTitleProgressCallback onTitleProgressCallback) {
467467
this.mOnTitleProgressCallback = onTitleProgressCallback;

ByWebView/src/main/java/me/jingbin/web/ByWebViewClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.jingbin.web;
22

33
import android.app.Activity;
4+
import android.app.AlertDialog;
45
import android.content.DialogInterface;
56
import android.graphics.Bitmap;
67
import android.net.http.SslError;
@@ -14,7 +15,6 @@
1415
import android.webkit.WebViewClient;
1516

1617
import androidx.annotation.RequiresApi;
17-
import androidx.appcompat.app.AlertDialog;
1818

1919
import java.lang.ref.WeakReference;
2020

ByWebView/src/main/java/me/jingbin/web/OnTitleProgressCallback.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package me.jingbin.web;
22

3+
import android.webkit.JsPromptResult;
4+
import android.webkit.JsResult;
5+
import android.webkit.WebView;
6+
37
/**
48
* Created by jingbin on 2020/6/30.
59
*/
@@ -29,4 +33,31 @@ public void onProgressChanged(int newProgress) {
2933
public boolean onHandleScreenOrientation(boolean isShow) {
3034
return false;
3135
}
36+
37+
/**
38+
* JavaScript alert 警告框
39+
* 默认返回false,使用代码里的默认处理
40+
* 如果要手动处理,需要返回true!且需要执行 result.confirm();
41+
*/
42+
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
43+
return false;
44+
}
45+
46+
/**
47+
* JavaScript confirm 确认框
48+
* 默认返回false,使用代码里的默认处理
49+
* 如果要手动处理,需要返回true!且需要执行 result.confirm();
50+
*/
51+
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
52+
return false;
53+
}
54+
55+
/**
56+
* JavaScript prompt 提示框
57+
* 默认返回false,使用代码里的默认处理
58+
* 如果要手动处理,需要返回true!且需要执行 result.confirm();
59+
*/
60+
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
61+
return false;
62+
}
3263
}

app/src/main/assets/java_js.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@
1616
("<br\>"+data);
1717
}
1818

19+
function myOnJsAlert(){
20+
window.alert("你好,我是一个警告框!");
21+
}
22+
function myOnJsConfirm(){
23+
window.confirm("你好,我是一个确认框!");
24+
}
25+
function myOnJsPrompt(){
26+
window.prompt("请输入姓名","张三");
27+
}
1928
</script>
2029
</head>
2130
<body>
@@ -26,6 +35,10 @@
2635
<!--可以将android端传过来的数据,处理后,放在这里再传给android端-->
2736
<li><a onClick="window.injectedObject.startFunction('我是网页传出来的数据')">点击调用java代码并传递参数</a></li><br/>
2837

38+
<li><a onClick="myOnJsAlert()">JavaScript alert 警告框</a><br/>
39+
<li><a onClick="myOnJsConfirm()">JavaScript confirm 确认框</a><br/>
40+
<li><a onClick="myOnJsPrompt()">JavaScript prompt 提示框</a><br/><br/><br/>
41+
2942
<div id="content">Java调用Js代码,内容显示: </div>
3043
</body>
3144
</html>

app/src/main/java/com/example/jingbin/webviewstudy/ui/ByWebViewActivity.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.example.jingbin.webviewstudy.ui;
22

3+
import android.app.AlertDialog;
4+
import android.app.Dialog;
35
import android.content.Context;
6+
import android.content.DialogInterface;
47
import android.content.Intent;
58
import android.graphics.Bitmap;
69
import android.net.Uri;
@@ -10,6 +13,8 @@
1013
import android.view.KeyEvent;
1114
import android.view.Menu;
1215
import android.view.MenuItem;
16+
import android.webkit.JsPromptResult;
17+
import android.webkit.JsResult;
1318
import android.webkit.SslErrorHandler;
1419
import android.webkit.WebView;
1520
import android.widget.LinearLayout;
@@ -127,6 +132,28 @@ public void onReceivedTitle(String title) {
127132
public boolean onHandleScreenOrientation(boolean isShow) {
128133
return super.onHandleScreenOrientation(isShow);
129134
}
135+
136+
/**
137+
* 自定义实现 onJsAlert 方法,如果不自定义可不实现此方法
138+
* 一定要执行 result.confirm();
139+
*/
140+
@Override
141+
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
142+
Dialog alertDialog = new AlertDialog.Builder(view.getContext()).
143+
setTitle("自定义标题").
144+
setMessage(message).
145+
setCancelable(false).
146+
setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
147+
@Override
148+
public void onClick(DialogInterface dialog, int which) {
149+
dialog.dismiss();
150+
result.confirm();
151+
}
152+
})
153+
.create();
154+
alertDialog.show();
155+
return true;
156+
}
130157
};
131158

132159
private OnByWebClientCallback onByWebClientCallback = new OnByWebClientCallback() {

0 commit comments

Comments
 (0)