J'ai deux boutons dans la vue Web. Je souhaite attribuer manuellement des événements de clic à leur. Voici mon code;
Code de la page Web
mWebview.loadUrl(link); mWebview.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { //Required functionality here return super.onJsAlert(view, url, message, result); }}); mWebview.addJavascriptInterface(new WebAppInterface(this), "AndroidInterface"); mWebview.getSettings().setJavaScriptEnabled(true); mWebview.getSettings().setLoadsImagesAutomatically(true); mWebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); public class WebAppInterface { Context mContext; // Instantiate the interface and set the context WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void showevent(String toast) { if(toast.equalsIgnoreCase("refer")){ Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); }else if(toast.equalsIgnoreCase("bottom_refer")){ Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } }
Voici mon code java;
<form method="post" name="refer_now"> <div class="refer-now-button"> <!-- <button type="submit" class="refer-now-btn" id="refer-now">refer now</button> --> <input type="button" class="refer-now-btn" value="refer now" name="refernow" id="refernow" onClick="showAndroidToast('refer');" /> </div> </form> <form method="post" name="refer_now_footer"> <div class="refer-now-button"> <!-- <button type="submit" class="refer-now-btn" id="refer_now_footer">refer now</button> --> <input type="button" class="refer-now-btn" value="refer now" name="refer-footer" id="refer-footer" onClick="showAndroidToast('bottom_refer');" /> </div> </form>
Quand j'exécute ce code; cela me donne des erreurs ci-dessous:
"Erreur de référence non interceptée: l'interface Android n'est pas définie",
3 Réponses :
Je ne sais pas si vous pouvez appeler la méthode addJavaScriptInterface
plusieurs fois avec différents noms
. Essayez de déplacer votre méthode performClick1
sous la même JavaScriptInterface
comme:
view.addJavascriptInterface(new Object() { @JavascriptInterface public void performClick() { Intent i = new Intent(FollowPageActivity.this, MyLoyaltyActivity.class); startActivity(i); } @JavascriptInterface public void performClick1() { Intent i = new Intent(FollowPageActivity.this, MyLoyaltyActivity.class); startActivity(i); } }, "refer_now");// identify which button you click
Pouvez-vous me dire comment puis-je accéder à une activité particulière des applications en cliquant sur le bouton de la page Web?
Avez-vous été incapable de naviguer vers l'activité comme vous l'avez mentionné en question? Sinon, jetez un œil à @ stackoverflow.com/a/9194012/1496502
Le formulaire avec le nom refer_now
serait affecté à la même propriété de l'objet global window
.
Cela signifie que refer_now
dans onclick = "refer_now.performClick ();"
était l'élément de formulaire.
La clé est assurez-vous que le nom du formulaire
et le nom de javascriptinterface
sont différents.
Voici une solution: gardez le code java et changez le html avec ce qui suit:
<form method="post" name="refer_now_form"> <div class="refer-now-button"> <!-- <button type="submit" class="refer-now-btn" id="refer-now">refer now</button> --> <input type="submit" class="refer-now-btn" value="refer now" name="refernow" id="refernow" onclick="refer_now.performClick();" /> </div> </form> <form method="post" name="refer_now_footer_form"> <div class="refer-now-button"> <!-- <button type="submit" class="refer-now-btn" id="refer_now_footer">refer now</button> --> <input type="submit" class="refer-now-btn" value="refer now" name="refer-footer" id="refer-footer" onclick="refer_now_footer.performClick1();" /> </div> </form>
Comment puis-je atteindre cet objectif
Ligne KEY
. Votre code était
. Les attributs de nom sont différents
J'ai donc besoin d'écrire «formulaire» dans le champ de nom de chaque bouton?
Assurez-vous simplement que le nom
du formulaire et le deuxième paramètre dans l'appel view.addJavascriptInterface
ne sont pas les mêmes.
Veuillez écrire le code java dans votre réponse ainsi que le code js
Pour que je puisse appliquer le code et marquer ainsi que vérifier votre réponse
Pour effectuer un clic sur le bouton à partir de la vue Web sous Android:
HTML et Java script
package com.ellvar.Activity.Common.Activity; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.Toast; import com.ellvar.CustomView.CustomDialog; import com.ellvar.CustomView.CustomProgressDialog; import com.ellvar.R; import com.ellvar.Utils.Utility; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; public class TermsConditionActivitydemo extends AppCompatActivity { @BindView(R.id.wv_termscondition) WebView wvTermscondition; @BindView(R.id.iv_back) ImageView ivBack; CustomProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_terms_condition); ButterKnife.bind(this); if (!Utility.getInstance().isNetworkAvailable(this)) { CustomDialog.getInstance().showalert(this, getString(R.string.please_check_internet_connection)); }else{ loaddata(); } } private void loaddata() { wvTermscondition.loadUrl("file:///android_asset/index.html"); wvTermscondition.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { //Required functionality here return super.onJsAlert(view, url, message, result); }}); wvTermscondition.addJavascriptInterface(new WebAppInterface(this), "AndroidInterface"); wvTermscondition.getSettings().setJavaScriptEnabled(true); wvTermscondition.getSettings().setLoadsImagesAutomatically(true); wvTermscondition.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); } @OnClick(R.id.iv_back) public void onViewClicked() { finish(); } public class WebAppInterface { Context mContext; // Instantiate the interface and set the context WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void showToast(String toast) { if(toast.equalsIgnoreCase("OK")){ Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); }else if(toast.equalsIgnoreCase("MR.VICKY")){ Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } } }
Code JAVA
<!DOCTYPE html> <html lang="en"> <body> <input type="button" value="Say hello" onClick="showAndroidToast('OK')" /> <input type="button" value="hello mr.vicky" onClick="showAndroidToast('MR.VICKY')" /> <br/><br/> <script type="text/javascript"> <!-- Sending value to Android --> function showAndroidToast(toast) { AndroidInterface.showToast(toast); } </script> </body> </html>
OUTPUT
Salut j'ai eu une erreur: "Erreur de référence non capturée: AndroidInterface n'est pas définie"
Qu'est-ce que ça veut dire?
J'ai pris toutes les références de votre code, j'ai toujours la même erreur
Veuillez essayer de créer un nouveau projet et juste après ces deux fichiers parce que je l'ai fait avec succès et téléchargé la sortie également.
Copie possible de Comment effectuer un clic sur un bouton dans une vue Web Android
@ Mr.vicky ce n'est pas une réponse en double. Je veux donner à plusieurs boutons un événement de clic. Si vous pouvez me donner une meilleure solution, cela me sera utile
s'il vous plaît vérifier ma réponse ci-dessous