У меня была похожая проблема: в веб-приложении я хотел бы использовать собственное диалоговое окно подтверждения Android.Это означает, что я должен перезвонить из Android в часть Javascript с результатом диалогового окна подтверждения.
Я решил это следующим образом:
function foo() {
// user confirmation needed
var dataString = <encode data into string>;
MyClient.showConfirmationDialog('myCallBackFunction', dataString, 'A title', 'A message');
}
Приведенный выше код вызывает JavaScript для JavaScriptинтерфейс (см. ниже).Javascript предоставляет метод обратного вызова myCallbackFunction()
, имя которого передается в Android в качестве параметра (вместе со строкой данных, заголовком и сообщением).Функция обратного вызова выглядит следующим образом:
function myCallbackFunction(dataString, result) {
var data = <decode data from dataString>;
if (result) {
// user has confirmed
} else {
// user has denied
}
}
На стороне Android я сначала активирую интерфейс Javascript в методе Activity onCreate()
:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webView = new WebView(this);
setContentView(webView);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyJavascriptInterface(webView), "MyClient");
}
Реализация MyJavascriptInterface
затем создает соответствующий диалог Android и передает результат обратно в javascript:
WebView webView;
public MyJavascriptInterface(WebView w) {
this.webView = w;
}
@JavascriptInterface
public void showConfirmationDialog(final String callbackFunction, final String data, String title,
String message) {
Dialog.OnClickListener positiveListener = new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
webView.loadUrl("javascript:" + callbackFunction + "('" + data + "', true)");
}
};
Dialog.OnClickListener negativeListener = new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
webView.loadUrl("javascript:" + callbackFunction + "('" + data + "', false)");
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(title).setMessage(message).setPositiveButton("Ok", positiveListener)
.setNegativeButton("Cancel", negativeListener).setCancelable(false);
builder.create().show();
}
Передача имени функции обратного вызова в Android позволяет использовать несколько вызовов в диалоговых окнах подтверждения, каждый из которых оснащен собственной функцией для выполнения функции.фактическое действие.Строка данных будет содержать все данные, необходимые для выполнения действия (и даже может содержать объекты в кодировке Json).