Обнаружение нажатия на кнопку HTML с помощью JavaScript в Android WebView - PullRequest
36 голосов
/ 01 ноября 2010

Я не очень хорошо знаком с javascript, но думаю, что это лучший способ для достижения моей цели.Если нет, пожалуйста, поправьте меня.

У меня есть текст лицензии 2 кнопки в конце.Все это написано в HTML WebView, потому что в лицензии есть некоторые ссылки.Теперь я хочу, чтобы, когда пользователь нажимал кнопку «ОК» в WebView, это вызывало некоторый JavaScript или прослушиватель, которые я мог получить в Java, чтобы запустить Intent для продвижения в приложении.(Кнопка отмены сделала бы обратное, но если я знаю, как сделать одно, я могу сделать другое.;))

Это звонит кому-нибудь?Любое объяснение или пример кода приветствуются.

Ответы [ 4 ]

59 голосов
/ 02 ноября 2010

Я наконец-то получил его самостоятельно после некоторого чтения.Сложно, когда вы ничего не знаете о javascript и когда документ довольно тонкий по теме.
Вот мое решение, надеюсь, это поможет другим:

С HTML-страницей, содержащей 2 кнопки в концевот так:

<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 - 2 объекта javaчто я прошел через интерфейс javascript, чтобы использовать их методы.Итак, в java я создал 2 кнопки (которые в действительности не отображаются в 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");

И, наконец, обработайте события нажатия в методе onClick:

@Override
public void onClick(View v) {
    if (v.equals(valid)) {
        //do Something
    } else if (v.equals(refuse)) {
        //do Something else }
}

Надеюсь, это поможет некоторым людям

39 голосов
/ 11 сентября 2011

Вот более простое решение.На стороне 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>
20 голосов
/ 09 марта 2014

Если вы также хотите получить значение кнопки.

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>
2 голосов
/ 09 марта 2017
    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>
...