Обнаруживать нажмите кнопку HTML через javascript в Android WebView
Я не очень хорошо знаком с javascript, но я думаю, что это лучший способ выполнить мою задачу. Если нет, пожалуйста, поправьте меня.
У меня есть текст с текстом лицензии в конце. Все это написано в HTML в WebView
, потому что в лицензии есть ссылки. Теперь я хочу, чтобы, когда пользователь нажимает кнопку "ok" в WebView
, это вызывает некоторый javascript или прослушиватель, который я могу захватить на Java, чтобы запустить Intent
для продвижения вперед в приложении. (Кнопка отмены будет делать наоборот, но если я знаю, как это сделать, я могу сделать другое.;))
Позволяет ли это кому-нибудь звонить?
Любое объяснение или образец кода приветствуются.
Ответы
Ответ 1
Я, наконец, получил это самостоятельно после некоторого чтения. Трудно, когда вы ничего не знаете о javascript и когда документ довольно тонкий по этому вопросу.
Вот мое решение, надеюсь, это поможет другим:
С HTML-страницей, состоящей из двух кнопок в конце:
<div>
<button type="button" id="ok" style="font-weight: 700; margin-right: 20px;" onclick="validClick();">J'accepte</button>
<button type="button" id="no" onclick="refuseClick();">Je refuse</button>
</div>
Я посылаю событие щелчка на javascript в верхней части моей страницы HTML:
<script language="javascript">
function validClick()
{
valid.performClick();
document.getElementById("ok").value = "J'accepte";
}
function refuseClick()
{
refuse.performClick();
document.getElementById("no").value = "Je refuse";
}
</script>
valid
и refuse
- это два java-объекта, которые я прошел через интерфейс javascript, чтобы использовать их методы. Поэтому в java я создал две кнопки (не отображаемые в Activity, только здесь для их методов и являются тенями кнопок HTML:
valid = new Button(ctx);
valid.setOnClickListener(this);
refuse = new Button(ctx);
refuse.setOnClickListener(this);
Затем я добавил javascript в мой WebView
:
// Enablejavascript
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
// Add the interface to record javascript events
wv.addJavascriptInterface(valid, "valid");
wv.addJavascriptInterface(refuse, "refuse");
И, наконец, обработайте события click в методе onClick:
@Override
public void onClick(View v) {
if (v.equals(valid)) {
//do Something
} else if (v.equals(refuse)) {
//do Something else }
}
Надеюсь, это поможет некоторым людям.
Ответ 2
Здесь более простое решение. На стороне Java создайте прослушиватель для каждой кнопки. Он не должен быть каким-либо конкретным классом, так как метод будет искать с помощью отражения:
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
public void performClick()
{
// Deal with a click on the OK button
}
}, "ok");
Затем в HTML вызовите его непосредственно из тега кнопки:
<button type="button" onclick="ok.performClick();">OK</button>
Ответ 3
Если вы также хотите получить значение кнопки.
Java:
WebSettings ws = wv.getSettings();
ws.setJavaScriptEnabled(true);
wv.addJavascriptInterface(new Object()
{
@JavascriptInterface // For API 17+
public void performClick(String strl)
{
stringVariable = strl;
Toast.makeText (YourActivity.this, stringVariable, Toast.LENGTH_SHORT).show();
}
}, "ok");
HTML:
<button type="button" value="someValue" onclick="ok.performClick(this.value);">OK</button>
Ответ 4
WebView browser = new WebView(this);
browser.getSettings().setJavaScriptEnabled(true);
browser.loadUrl("file:///android_asset/page.html");
setContentView(browser);
WebSettings ws = browser.getSettings();
ws.setJavaScriptEnabled(true);
browser.addJavascriptInterface(new Object()
{
@JavascriptInterface // For API 17+
public void performClick(String strl)
{
Toast.makeText (MainActivity.this, strl, Toast.LENGTH_SHORT).show();
}
}, "ok");
page.html файл
<html>
<body>
First name: <input type="text" name="fname" id="txtfname"><br>
Last name: <input type="text" name="lname" id="txtlname"><br>
<script>
function getValues() {
document.getElementById("btnOK").value = document.getElementById("txtfname").value+" "+document.getElementById("txtlname").value;
}
</script>
<button type="button" value="" id="btnOK" onclick="getValues();ok.performClick(this.value);">OK</button>
</body>
</html>