обнаружение, если щелкнуть элемент webview по id [дубликат]

Все зависит от того, сколько разных удаленных почтовых клиентов вы сможете поддерживать. Я считаю, что известные библиотеки Delphi, поддерживающие SMTP / Mime, будут выполнять разумную работу, но они могут оставить вам проблемы с поддержкой, когда один из ваших почтовых пользователей обнаруживает, что их получатель не может видеть правильно отформатированное электронное письмо.

Я рекомендую посетить сайт Jacob Palme , который даст вам представление о некоторых проблемах, с которыми вы можете столкнуться. Возможно, это немного устарело, но в целом, однако вы создаете и отправляете сложную электронную почту MIME, вы столкнетесь с одним или несколькими почтовыми клиентами, которые не могут правильно обработать синтаксис. На сайте также есть ссылки на некоторые полезные примеры конструкций, которые вы можете проверить и проверить.

Я не хочу подразумевать, что вам нужно сворачивать свою собственную логику так же, как и мы: хорошее упакованное решение, вероятно, будет успех в подавляющем большинстве случаев. Мы писали наш собственный код Delphi, чтобы справиться с этим несколько лет назад, поэтому я оставлю его другим, чтобы предоставить вам самую последнюю информацию о том, что сейчас находится на полке.

35
задан Sathya 12 September 2011 в 07:17
поделиться

4 ответа

Я, наконец, получил это самостоятельно после некоторого чтения. Трудно, когда вы ничего не знаете о 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");

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

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

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

58
ответ дан Bhavin Nattar 16 August 2018 в 00:18
поделиться
  • 1
    @neha, как решить эту проблему, дайте мне простой пример. – NagarjunaReddy 18 April 2013 в 13:40
  • 2
    @Sephy вы можете объяснить, что является действительным и отказать в том, что они являются кнопками или объектами JavaWebInterface? И метод onclick заключается в том, что вы внедрили onclick-прослушиватель или что-то в этом роде? Извините, но я не могу запустить вышеуказанный код. Пожалуйста помоги. благодаря – newBie 9 September 2013 в 06:33
  • 3
    @Sephy это не работает в Android 2.3. Я там какой-нибудь способ реализовать это? – Mr.India 10 October 2013 в 08:01
  • 4
    Кто-нибудь здесь? он не работает в 4.1 и 4.2. Пожалуйста помоги – Geet taunk 21 November 2013 в 11:35
  • 5
    как насчет удаленного URL-адреса, который не находится в папке с ресурсами, как получить от него щелчок – George Thomas 15 November 2014 в 09:32

Вот более простое решение. На стороне 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>
37
ответ дан peastman 16 August 2018 в 00:18
поделиться
  • 1
    Мне кажется, что я такой же, как у меня, хотя с одной кнопкой. Обратите внимание, что я привяжу интерфейс javascript к Button вместо простого объекта, таким образом вы сможете использовать весь набор методов и вещей вокруг кнопок! – Sephy 13 September 2011 в 13:21
  • 2
    Метод peastman на самом деле лучше, по крайней мере семантически. Привязка к Button заставит людей думать, что между ними есть связь, но нет. Код не заботит, привязываете ли вы свой JavaScript к Button или Bitmap или к обычной Object. Он будет вызывать любую функцию, о которой вы говорите. Вы не получаете доступ к дополнительным методам. Например, вызов setText() на вашем Java Button объекте не изменит текст ваших HTML-кнопок. – Steve Blackwell 5 April 2013 в 05:04
  • 3
    Это одна потрясающая работа! – Karthik 9 April 2013 в 08:36
  • 4
    ВАЖНЫЙ! Для устройств api level 17+ Не забудьте добавить & quot; @ JavascriptInterface & quot; аннотаций. Из developer.android.com/guide/webapps/webview.html Внимание: если вы установили цель targetSdkVersion на 17 или выше, вы должны добавить & quot; @ JavascriptInterface & quot; аннотации к любому методу, который вы хотите использовать для вашего JavaScript (этот метод также должен быть общедоступным). Если вы не предоставите аннотацию, этот метод недоступен на вашей веб-странице при работе на Android 4.2 или выше. – inankupeli 22 October 2013 в 15:59
  • 5
    Я пытался, но не работал для меня. См. stackoverflow.com/questions/20917235/… – iAmLearning 4 January 2014 в 07:15
    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>

0
ответ дан Raviraj Desai 16 August 2018 в 00:18
поделиться

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

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>
16
ответ дан user2999943 16 August 2018 в 00:18
поделиться
  • 1
    Вызывает ли это имя "performClick" должен быть одинаковым как для java, так и для javascript? – user1530779 8 August 2015 в 11:43
  • 2
    Вызывает ли это имя "performClick" должен быть одинаковым как для java, так и для javascript? – user1530779 8 August 2015 в 12:01
  • 3
    @ user1530779 Да, потому что это имя функции Object – FrenchFalcon 26 December 2015 в 14:21
Другие вопросы по тегам:

Похожие вопросы: