2010-10-31 80 views
34

我不是很熟悉JavaScript,但我认为这是实现我的目的的最佳方式。如果没有,请纠正我。通过在Android WebView中的JavaScript检测点击HTML按钮

我在最后有一个许可证文本2个按钮。所有这些都用HTML编写在WebView中,因为许可证中有一些链接。现在,我希望当用户点击WebView中的“ok”按钮时,这会触发一些JavaScript或侦听器,我可以用Java抓取它以触发Intent以在应用程序中继续前进。 (取消按钮会做相反的事情,但如果我知道如何做到这一点,我可以做另一个;))

这是否对任何人响铃? 欢迎任何解释或示例代码。

回答

56

经过一番阅读,我终于明白了。当你对javascript一无所知时,以及关于这个主题的文档非常薄弱的​​时候很难。
这里是我的解决方案,希望这能帮助别人:

含2个按钮,在年底这样一个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> 

validrefuse是我通过JavaScript接口,通过使用他们的方法2个Java对象。所以在Java中,我创建了2个按钮(没有真正显示在活动,只有在这里为他们的方法和有几分的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 } 
} 

希望这将帮助一些人

+0

@neha如何解决这个问题给我任何简单的例子.. – NagarjunaReddy 2013-04-18 12:40:02

+2

@Sephy能否请您解释一下什么是有效的,并拒绝他们是按钮或JavaWebInterface对象? onclick方法是因为你已经实现了onclick监听器或类似的东西?我很抱歉,但我无法运行上述代码。请帮忙。谢谢 – newBie 2013-09-09 05:33:27

+0

@Sephy这不适用于Android 2.3。我在那里我有什么办法来实现这一点? – 2013-10-10 07:01:55

35

这是一个更简单的解决方案。在Java方面,为每个按钮创建一个侦听器。它不需要是任何特定类型的,因为该方法将使用反射来查找:在HTML

WebSettings ws = wv.getSettings(); 
ws.setJavaScriptEnabled(true); 
wv.addJavascriptInterface(new Object() 
{ 
    public void performClick() 
    { 
    // Deal with a click on the OK button 
    } 
}, "ok"); 

然后,直接从按键标签调用它:

<button type="button" onclick="ok.performClick();">OK</button> 
+1

虽然只有一个按钮,但对我来说似乎与我的完全一样。请注意,我会将JavaScript接口绑定到Button而不是简单的Object,这样您就可以使整个按钮周围的方法和东西受益! – Sephy 2011-09-13 12:21:58

+0

佩斯特曼的方法实际上更好,至少在语义上。绑定到“Button”会诱使人们认为它们之间存在关联,但并不存在。代码不关心你是否将JavaScript绑定到'Button'或'Bitmap'或普通的'Object'。它会调用你告诉它的任何函数。您无法访问额外的方法。例如,在你的Java'Button'对象上调用'setText()'不会改变你的HTML按钮的文本。 – 2013-04-05 04:04:47

+0

这就是一件很棒的工作! – Karthik 2013-04-09 07:36:48

15

万一你也想要检索按钮的值。

的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> 
+0

此名称“performClick”在java和javascript中必须相同? – user1530779 2015-08-08 11:43:09

+0

这个名字“performClick”在java和javascript中必须相同吗? – user1530779 2015-08-08 12:01:11

+1

@ user1530779是的,因为它是Object函数的名称 – FrenchFalcon 2015-12-26 13:21:10

0
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"); 

页。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>