2010-11-16 2 views
52

J'ai créé mon propre WebView et défini les objets WebChromeClient et WebViewClient. Lorsque je lance ce WebView, les champs du formulaire HTML réagissent lorsque je les touche (un curseur apparaît), mais ils ne sont pas sélectionnés et le clavier logiciel ne démarre pas non plus. Si j'utilise la boule de commande pour choisir le formulaire et l'appuyer, le clavier apparaît.Le champ de formulaire Tapping dans WebView n'affiche pas le clavier virtuel

J'ai essayé d'appeler myWebview.requestFocusFromTouch() comme this answer suggéré, mais il renvoie false et n'aide pas.

+0

avez-vous fait cela? : http://stackoverflow.com/questions/35465569/changing-the-input-source-of-form-fields-in-webview – debonair

Répondre

94

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

Voici une solution dans le cas où d'autres ne sont pas claires.

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

Thx ... ce comportement semble être un bug, il est corrigé dans ICS. – Janusz

+0

@androidchen Merci beaucoup ... vous économisez mon temps :) –

+0

Je reçois des erreurs avec ceci - il veut que je rebaptise "onTouch" ... que dois-je faire ??? S'il vous plaît aider – Levchik

3

réponse de AndroidChen ne fonctionnait pas pour moi du tout, mais je recherche le lien fourni (http://code.google.com/p/android/issues/detail?id=7189) et je trouve la classe suivante, il fonctionne parfaitement (Android Froyo sur le HTC Bravo), pas seulement du texte, mais aussi tous les boutons, réoriente, etc, tout fonctionne parfaitement: D

class LiveWebView extends WebView 
{ 
    Context mContext; 

    public LiveWebView(Context context, String URL) 
    { 
     super(context); 
     mContext = context; 
     setWebViewClient(URL); 
    } 

    @Override 
    public boolean onCheckIsTextEditor() 
    { 
     return true; 
    } 

    @SuppressLint("SetJavaScriptEnabled") 
    boolean setWebViewClient(String 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, String url) 
      { 
       loadUrl(url); 

       return true; 
      } 

      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
      { 
       Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 
      } 

      public void onPageStarted(WebView view, String url, Bitmap favicon) 
      { 
       if (dialog != null) 
       { 
        dialog.setMessage("Loading..."); 
        dialog.setIndeterminate(true); 
        dialog.setCancelable(true); 
        dialog.show(); 
       } 

      } 

      public void onPageFinished(WebView view, String 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, String url, String message, JsResult result) 
      { 
       result.confirm(); 
       return true; 
      } 
     }); 

     loadUrl(URL); 

     return true; 
    } 
} 

puis de créer une WebView dans un dialogue, je l'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(); 
+0

Merci, Dv_MH! La réponse acceptée ne fonctionne pas non plus pour moi, mais celle-ci fonctionne. –

24

Convenu 10% avec des années Dv_MH répondre. Cependant, la classe ci-jointe était un peu excessive. Tout ce que je devais faire était prolonger WebView & return true pour onCheckIsTextEditor()

import android.content.Context; 
import android.util.AttributeSet; 
import android.webkit.WebView; 

public class LiveWebView extends WebView { 

    public LiveWebView(Context context) { 
     super(context); 
    } 

    public LiveWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public LiveWebView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onCheckIsTextEditor() { 
     return true; 
    } 
} 

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

Alternativement, avec moins de code:

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

Ce fut le seul qui a réellement fonctionné pour moi aussi. Tout le reste ignoré le clavier souple. – kingargyle

+0

Cela a fonctionné pour moi (et pas la première réponse) sur 'DialogFrament' – David

+0

Cela a fonctionné pour moi aussi bien. Je l'ai fait un peu différemment –

4

IMPORTANT J'ai passé des heures à chercher et je résolu le problème en faisant en sorte que la mise en page de parent qui étend « ViewGroup » n'a pas la propriété

android: descendantFocusability = "blocksDescendants" qui empêchent la mise au point des enfants

OU Ajouter android: focusable = "true" WebView

+0

cherché mon projet pour "descendantFocusability" supprimé cette ligne et il a finalement travaillé. N'a pas été dans un webView et je ne suis pas sûr de savoir comment cette ligne s'est terminée dans le code source. – chaggy

1

Ajoutez juste EditText invisible sous WebView

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:visibility="invisible" /> 

<WebView 
    android:id="@+id/webView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Toutes ces solutions relation avec le focus ne fonctionnent pas sur ma note Samsung 3/Android 5.0

Questions connexes