Taper sur le champ de formulaire dans WebView n’affiche pas le clavier logiciel

J’ai créé ma propre WebView et défini les objects WebChromeClient et WebViewClient. Lorsque je lance cette WebView, les champs de formulaire HTML réagissent lorsque je les touche (un curseur apparaît), mais ils ne sont pas sélectionnés et le clavier virtuel ne démarre pas. Si j’utilise la boule de commande pour choisir le formulaire et appuyez dessus, le clavier apparaît.

J’ai essayé d’appeler myWebview.requestFocusFromTouch() comme suggéré dans cette réponse , mais il retourne faux et n’aide pas.

http://code.google.com/p/android/issues/detail?id=7189

Voici un correctif au cas où d’autres ne seraient pas clairs.

 webview.requestFocus(View.FOCUS_DOWN); webview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if (!v.hasFocus()) { v.requestFocus(); } break; } return false; } }); 

Convenu 10% avec la réponse de Dv_MH. Cependant, la classe attachée était un peu excessive. Tout ce que j’avais à faire était d’étendre WebView et de retourner true pour onCheckIsTextEditor ()

 import android.content.Context; import android.util.AtsortingbuteSet; import android.webkit.WebView; public class LiveWebView extends WebView { public LiveWebView(Context context) { super(context); } public LiveWebView(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public LiveWebView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onCheckIsTextEditor() { return true; } } 

À partir de là, j’ai pu l’utiliser comme WebView normal (même dans Dialogs).

Alternativement, avec moins de code:

 WebView web = new WebView(context) { @Override public boolean onCheckIsTextEditor() { return true; } }; 

IMPORTANT J’ai passé des heures à chercher ceci et je l’ai résolu en m’assurant que la mise en page parent qui étend “ViewGroup” n’a pas de propriété

android: descendantFocusability = “blocksDescendants” qui empêchent la mise en page de l’enfant

OU Ajouter Android: focusable = “true” à webview

La réponse d’AndroidChen ne fonctionnait pas du tout pour moi, mais j’ai cherché le lien fourni ( http://code.google.com/p/android/issues/detail?id=7189 ) et j’ai trouvé la classe suivante, elle fonctionne parfaitement ( Android Froyo sur HTC Bravo), pas seulement du texte, mais aussi tous les boutons, les redirections, etc., tout fonctionne parfaitement: D

 class LiveWebView extends WebView { Context mContext; public LiveWebView(Context context, Ssortingng URL) { super(context); mContext = context; setWebViewClient(URL); } @Override public boolean onCheckIsTextEditor() { return true; } @SuppressLint("SetJavaScriptEnabled") boolean setWebViewClient(Ssortingng URL) { setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY); setFocusable(true); setFocusableInTouchMode(true); requestFocus(View.FOCUS_DOWN); WebSettings webSettings = getSettings(); webSettings.setSavePassword(false); webSettings.setSaveFormData(false); webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(false); webSettings.setUseWideViewPort(false); setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: if (!v.hasFocus()) { v.requestFocus(); } break; } return false; } }); this.setWebViewClient(new WebViewClient() { ProgressDialog dialog = new ProgressDialog(mContext); @Override public boolean shouldOverrideUrlLoading(WebView view, Ssortingng url) { loadUrl(url); return true; } public void onReceivedError(WebView view, int errorCode, Ssortingng description, Ssortingng failingUrl) { Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } public void onPageStarted(WebView view, Ssortingng url, Bitmap favicon) { if (dialog != null) { dialog.setMessage("Loading..."); dialog.setIndeterminate(true); dialog.setCancelable(true); dialog.show(); } } public void onPageFinished(WebView view, Ssortingng url) { if (dialog != null) { dialog.cancel(); } } }); this.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% } @Override public boolean onJsAlert(WebView view, Ssortingng url, Ssortingng message, JsResult result) { result.confirm(); return true; } }); loadUrl(URL); return true; } } 

et puis pour créer une webview dans une boîte de dialog, j’ai écrit ce code

 AlertDialog.Builder alert = new AlertDialog.Builder(M_PaymentOptions.this); alert.setNegativeButton("Back to Payment Options", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) {} }); alert.setTitle("BarclayCard Payment"); LiveWebView liveWevViewObject = new LiveWebView(M_PaymentOptions.this, redirecturl); alert.setView(liveWevViewObject); alert.show(); 

Il suffit d’append invisible EditText sous WebView

    

Toutes ces solutions liées au focus ne fonctionnaient pas sur mon Samsung Note 3 / Android 5.0