Webview的Html按钮单击检测活动(java代码)

时间:2014-01-04 05:12:31

标签: android webview htmlbutton

我试图将webview的html按钮点击检测到java代码(In activity) 我提到了另一个SO
Detect click on HTML button through javascript in Android WebView

但是没有用。我的代码:

的index.html

<html>
    <head>
        <script language="javascript">
            function js1() {
                document.loginform.method="post";
                document.loginform.action = "https://example.com/chechlogin.asp";
            }
        </script>  
    </head>
    <body>
        <form name="loginform">
            <input type="text" name="empcode" value="58686" /><br/>
            <input type="password" name="emppassNTL" />
            <input type="submit" name="submit" id="submit_id" onclick="login.performClick();" />    
        </form>
    </body>
</html>

MainActivity.java

package com.example.webview;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

   private EditText field;
   private WebView browser;

   @Override        
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      field = (EditText)findViewById(R.id.urlField);
      browser = (WebView)findViewById(R.id.webView1);
      browser.getSettings().setJavaScriptEnabled(true);
      browser.setWebViewClient(new MyBrowser());
      browser.loadUrl("file:///android_asset/index.html");
   }


   @SuppressLint("JavascriptInterface")
   public void open(View view){
      String url = field.getText().toString();
      browser.getSettings().setLoadsImagesAutomatically(true);
      browser.getSettings().setJavaScriptEnabled(true);
      browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
      browser.loadUrl(url);
      browser.addJavascriptInterface(new Object()
      {
          @JavascriptInterface
        public void performClick()
        {
            Log.d("LOGIN::", "Clicked");
             Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
        }
      }, "login");

   }
   private class MyBrowser extends WebViewClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;
      }
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

}  

但是没有调用performClick()方法 请更正错误。

6 个答案:

答案 0 :(得分:7)

这是我实施的方式:

public class FirstActivity extends Activity {

WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);

    mWebView = (WebView) findViewById(R.id.webView1);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
    mWebView.loadUrl("file:///android_asset/html/File1.html");
}

public class WebAppInterface {

    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void nextScreen(String pro_cat_id) {

            startActivity(new Intent(mContext,
         MainActivity.class));
    }

并且,在html文件中:

javascript:file3.js

function saveId(_id)
{
    localStorage.setItem("id", _id);
    Android.nextScreen(_id);
}

HTML:

<html>
    <head>
        <script type="text/javascript" src="arel/js/File3.js"></script>
    </head>
    <body>
        <button onClick="saveId('1');">1</button>
        <button onClick="saveId('2');">2</button>
    </body>
</html>

答案 1 :(得分:5)

尝试替换此

 browser.addJavascriptInterface(new Object()
      {
          @JavascriptInterface
        public void performClick()
        {
            Log.d("LOGIN::", "Clicked");
             Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
        }
      }, "login");

到这个

Button btnLogin=new Button(ctx);
btnLogin.setOnClickListener(this);

browser.addJavascriptInterface(btnLogin,"login");

@Override
public void onClick(View v) {

        //do Something

}

和index.html

<html>  <head>  <script language="javascript">  function js1() {
    document.loginform.method="post";  document.loginform.action = "https://example.com/chechlogin.asp";
           }
     </script>  </head>  <body>    <form name="loginform">
     <input type="text" name="empcode" value="58686" /><br/>
     <input type="password" name="emppassNTL" />
     <input type="submit" name="submit" id="submit_id" onclick="btnLogin.performClick();" />

此处有更多信息:https://developer.android.com/guide/webapps/webview.html#BindingJavaScript

答案 2 :(得分:2)

您需要创建并将JavaScript界面​​从Android传递到JavaScript。然后,您可以使用此接口作为桥接器来传递带参数的函数调用。

此处提供更多详细信息和示例:http://developer.android.com/guide/webapps/webview.html#BindingJavaScript

答案 3 :(得分:1)

哎呀!!!
performClick()方法出错了。
MainActivity.java应该是这样的:

package com.example.webview;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

   private WebView browser;

   @Override        
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      browser = (WebView)findViewById(R.id.webView1);
      browser.getSettings().setJavaScriptEnabled(true);
      browser.getSettings().setLoadsImagesAutomatically(true);
      browser.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
      browser.setWebViewClient(new MyBrowser());
      browser.loadUrl("file:///android_asset/index.html");
   }


   private class MyBrowser extends WebViewClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url); 
          view.addJavascriptInterface(new Object()
          {
              @JavascriptInterface
            public void performClick() throws Exception
            {
                Log.d("LOGIN::", "Clicked");
                 Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
            }
          }, "login");
         return true;
      }
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

}

答案 4 :(得分:1)

在html中首先使用方法 performClick()创建一个名为 BtnLogin 的按钮,如下所示:

<input type="submit" name="submit" id="submit_id" onclick="BtnLogin.performClick();" /> 

现在在Android(活动或片段)中,您将使用以下代码:

private class MyBrowser extends WebViewClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url); 
          view.addJavascriptInterface(new Object()
          {
              @JavascriptInterface
            public void performClick() throws Exception //method which you call on button click on HTML page
            {
                Log.d("LOGIN::", "Clicked");
                 Toast.makeText(MainActivity.this, "Login clicked", Toast.LENGTH_LONG).show();
            }
          }, "BtnLogin");// identify which button you click
         return true;
      }
   }

希望它会有所帮助。

答案 5 :(得分:0)

Web代码:

HTML代码:

 <button class="btn btn-success w-md waves-effect waves-light" id="btnsubmit" type="button" tabindex="3" onclick="getValues();ok.performClick(this.value);"> @Utility.GetDisplayName(Utility.ResourceKey.lblClicktoApp)</button>

Jquery:

var model = {
            "_id": nationalid,//if need to send as argument
            "btnId":"btnsubmit"
        };
        function getValues() {
            document.getElementById("btnsubmit").value = _id

        }
        document.getElementById("btnsubmit").addEventListener("click", function () {
            webkit.messageHandlers.callbackHandler.postMessage(model);
        });

Android:

 act_webview_WebView.addJavascriptInterface(MyJavaScriptInterface(mContext),"ok")

            act_webview_WebView!!.webViewClient = object : WebViewClient() {


                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    view?.loadUrl(url)

                    return true
                }

                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                    super.onPageStarted(view, url, favicon)
                    try {
                        webview_progressBar.visibility = View.VISIBLE
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }

                override fun onPageFinished(view: WebView?, url: String?) {
                    super.onPageFinished(view, url)
                    try {
                        webview_progressBar.visibility = View.GONE
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }

                }

                override fun onReceivedError(
                    view: WebView?,
                    request: WebResourceRequest?,
                    error: WebResourceError?
                ) {
                    super.onReceivedError(view, request, error)

                    try {
                        webview_progressBar.visibility = View.GONE
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            }
            act_webview_WebView!!.loadUrl(URL)

act_webview_WebView.addJavascriptInterface(new Object()       {           @JavascriptInterface         公共无效的performClick()         {             Log.d(“ LOGIN ::”,“ Clicked”);              Toast.makeText(MainActivity.this,“登录已单击”,Toast.LENGTH_LONG).show();         }       },“ login”);

Proguard:

# For webview
#Start
#-keep class * extends android.webkit.WebChromeClient { *; }
#-dontwarn im.delight.android.webview.*
-keep class android.support.v8.renderscript.** { *; }
-keepclassmembers class apppackage.WebviewFragments {
   public *;
}
-dontwarn
-keepattributes Signature
-keepattributes SetJavaScriptEnabled
-keepattributes JavascriptInterface
-keepattributes InlinedApi
-keepattributes SourceFile,LineNumberTable
-keepattributes *Annotation*

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

-keepclassmembers class **.*$MyJavaScriptInterface {
    *;
}
-keepclassmembers class **.*$JavaScriptInterface {
    *;
}

-keep public class **.*$MyJavaScriptInterface
-keep public class **.*$JavaScriptInterface
#END