通过Android WebView中的javascript检测对HTML按钮的点击

通过Android WebView中的javascript检测对HTML按钮的点击,javascript,android,click,webview,Javascript,Android,Click,Webview,我对javascript不是很熟悉,但我认为这是实现我的目标的最好方法。如果没有,请纠正我 我有一个许可证文本,末尾有两个按钮。所有这些都是在WebView中用HTML编写的,因为许可证中有一些链接。现在,我希望当用户单击WebView中的“ok”按钮时,这会触发一些javascript或侦听器,我可以在Java中获取这些javascript或侦听器来激发意图,以便在应用程序中继续。(取消按钮的作用正好相反,但如果我知道如何做一个,我可以做另一个。) 这对某人有影响吗? 欢迎您提供任何解释或示例

我对javascript不是很熟悉,但我认为这是实现我的目标的最好方法。如果没有,请纠正我

我有一个许可证文本,末尾有两个按钮。所有这些都是在
WebView
中用HTML编写的,因为许可证中有一些链接。现在,我希望当用户单击
WebView
中的“ok”按钮时,这会触发一些javascript或侦听器,我可以在Java中获取这些javascript或侦听器来激发
意图
,以便在应用程序中继续。(取消按钮的作用正好相反,但如果我知道如何做一个,我可以做另一个。)

这对某人有影响吗?
欢迎您提供任何解释或示例代码。

经过一番阅读,我终于自己得到了它。当你对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添加到我的
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方法中处理click事件:

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

希望这能帮助一些人

这里有一个更简单的解决方案。在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>
OK

如果您还想检索按钮值

爪哇:

HTML:

OK
page.html文件


名字:
姓氏:
函数getValues(){ document.getElementById(“btnOK”).value=document.getElementById(“txtfname”).value+“”+document.getElementById(“txtlname”).value; } 好啊
打印
addJavascriptInterface(新对象(){
@JavascriptInterface//For API 17+
public void performClick(字符串strl){
//表演舔
}
}“好的”;

使用下面的Android代码和下面给出的Android代码的web代码。 我已经实现了下面所有的代码,它在android版本11中运行得非常好

 mWebView.loadUrl(outputResponse.getRedirectUserTo());
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Intent returnIntent = new Intent();
                        returnIntent.putExtra("result",message);
                        setResult(Activity.RESULT_OK,returnIntent);
                        finish();
                    }
                });
                return true;
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
函数validClick()
{
警惕(“成功”);
}

{
背景#f2f2;
}
付款
{
边框:2px实心#01BD9A;
高度:280px;
边界半径:20px;
背景:#fff;
}
.付款标题
{
背景:#01BD9A;
填充:20px;
边界半径:20px 20px 0px 0px;
}
.按钮
{
背景#F55951;
填充:10px;
利润率最高:30;
边界半径:20px 20px 20px 20px;
}
.检查
{
保证金:0px自动;
宽度:50px;
高度:50px;
边界半径:100%;
背景:#fff;
文本对齐:居中;
}
.检查i
{
垂直对齐:中间对齐;
线高:50px;
字体大小:30px;
}
.内容
{
文本对齐:居中;
}
.内容h1
{
字体大小:25px;
填充顶部:25px;
}
.内容a
{
宽度:200px;
高度:35px;
颜色:#fff;
边界半径:30px;
填充物:5px10px;
背景:rgba(255102,0,1);
过渡:全部缓进缓出0.3s;
}
.内容a:悬停
{
文字装饰:无;
背景:#000;
}

付款成功!
回去

在我看来,虽然只有一个按钮,但与我的完全相同。请注意,我将javascript界面绑定到一个按钮,而不是一个简单的对象,这样您就可以受益于按钮周围的所有方法和内容!农民的方法实际上更好,至少在语义上是这样。绑定到
按钮
会诱使人们认为它们之间有联系,但事实并非如此。代码并不关心是否将JavaScript绑定到
按钮
位图
或普通的
对象
。它将调用您告诉它的任何函数。您无法访问额外的方法。例如,在Java
按钮
对象上调用
setText()
不会更改HTML按钮的文本。重要信息!对于api级别17+的设备,不要忘记添加“@JavascriptInterface”注释。注意:如果您已将targetSdkVersion设置为17或更高,则必须将“@JavascriptInterface”注释添加到您希望JavaScript可用的任何方法中(该方法也必须是公共的)。如果您不提供注释,则在Android 4.2或更高版本上运行时,您的网页无法访问该方法。我尝试过,但没有为我工作。请参阅无法添加javascriptInterface@Sephy请您解释一下什么是有效的,它们是按钮还是JavaWebInterface对象?而onclick方法是因为您实现了onclick侦听器或类似的东西?很抱歉,我无法运行上述代码。请帮忙。Thanks@Sephy这在Android 2.3中不起作用。我有什么办法可以实现吗?有人吗?它在4.1和4.2中也不起作用。请帮助不在资产文件夹中的远程url如何从中获取单击it@Sephy:我在这里假设对象应该有一个单击侦听器,函数的名称不重要,对吗?或者简单地说,performClick可以替换为任何文本?这个名称“performClick”在java和javascript中必须相同吗?这个名称“performClick”在java和javascript中必须相同吗?@user1530779是的,因为它是对象函数的名称
<button type="button" onclick="ok.performClick();">OK</button>
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");
<button type="button" value="someValue" onclick="ok.performClick(this.value);">OK</button>
    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");
<b><button type = "button" value = "print" onclick="ok.performClick(this.value)" id="ok">PRINT</button></b>


webView.addJavascriptInterface( new Object() {
        @JavascriptInterface // For API 17+
        public void performClick (String strl) {
            //performClick 
        }
    } , "ok" ) ;
 mWebView.loadUrl(outputResponse.getRedirectUserTo());
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Intent returnIntent = new Intent();
                        returnIntent.putExtra("result",message);
                        setResult(Activity.RESULT_OK,returnIntent);
                        finish();
                    }
                });
                return true;
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });