web-dev-qa-db-fra.com

Détection de clic sur le bouton HTML de Webview dans Activity (code Java)

J'essayais de détecter le clic du bouton html de la vue Web en code Java (en activité).
J'ai référé un autre SO
Détecter, cliquez sur le bouton HTML via JavaScript dans Android WebView

mais ne fonctionne pas.Mon code: 

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;
   }

}  

Mais la méthode performClick () n'est pas appelée.
.__ Veuillez corriger l'erreur.

10
iAmLearning

Voici comment j'ai implémenté:

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));
    }

Et, dans le fichier 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>
7
Chintan Soni

essayez de repalce cela 

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

pour ça

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

browser.addJavascriptInterface(btnLogin,"login");

@Override
public void onClick(View v) {

        //do Something

}

et dans 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();" />

Plus d'infos ici: https://developer.Android.com/guide/webapps/webview.html#BindingJavaScript

4
Hardik

Vous devez créer et transmettre une interface JavaScript d'Android à JavaScript. Vous pouvez ensuite utiliser cette interface en tant que pont pour passer des appels de fonction avec des arguments.

Plus de détails et d'exemples ici: http://developer.Android.com/guide/webapps/webview.html#BindingJavaScript

2
Shakti

Ooops !!!
La méthode performClick () était au mauvais endroit.
MainActivity.Java devrait ressembler à ceci: 

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;
   }

}
1
iAmLearning

Tout d'abord, créez un bouton avec le nom BtnLogin with method performClick () comme ci-dessous:

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

Maintenant, dans Android (Activité ou Fragment), vous utiliserez le code ci-dessous:

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;
      }
   }

J'espère que ça va aider.

0
Tell Me How