2010-11-16 6 views
52

creé mi propia vista Web y establecer los objetos WebChromeClient y WebViewClient. Cuando inicio este WebView, los campos de formulario HTML reaccionan cuando los toco (aparece un cursor), pero no se seleccionan ni se inicia el teclado virtual. Si uso la bola de seguimiento para elegir el formulario y lo presiono, el teclado aparece.Tapping campo de formulario en vista Web no muestra teclado de software

Traté de llamar al myWebview.requestFocusFromTouch() como this answer sugerido, pero devuelve falso y no ayuda.

+0

has hecho esto? : Http://stackoverflow.com/questions/35465569/changing-the-input-source-of-form-fields-in-webview – debonair

Respuesta

94

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

Aquí es una solución en caso de que otro no estaban claras.

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 ... este comportamiento parece ser un error, se fija en el ICS. – Janusz

+0

@androidchen Muchas gracias ... me salvaste el tiempo :) –

+0

Tengo errores con esto - me quiere cambiar el nombre "onTouch" ... ¿qué hago ??? Por favor ayuda – Levchik

3

respuesta de AndroidChen no funcionó para mí en absoluto, pero me buscó en el enlace que aparece (http://code.google.com/p/android/issues/detail?id=7189) y me encontré con la siguiente clase, funciona perfectamente (Froyo Android en HTC Bravo), no sólo texto, sino también todos los botones, redirecciones, etc, todo funciona perfectamente: 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; 
    } 
} 

y luego crear una vista web dentro de un diálogo, escribí este código

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

¡Gracias, Dv_MH! La respuesta aceptada tampoco me funciona, pero esta funciona. –

24

10% acordado con la Dv_MH responder. Sin embargo, la clase adjunta fue un poco excesiva. Todo lo que tenía que hacer era extender WebView & retorno cierto para 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; 
    } 
} 

A partir de ahí, yo era capaz de utilizarlo como un WebView normal (incluso en cuadros de diálogo).

alternativa, con menos código:

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

Este fue el único que realmente funcionó para mí también. Todo lo demás ignoró el teclado suave. – kingargyle

+0

Esto funcionó para mí (y no la primera respuesta) en 'DialogFrament' – David

+0

Esto también me funcionó. Lo hice un poco diferente –

4

IMPORTANTE Me pasé horas en busca de esto y lo solucioné, asegurándose de que la disposición de los padres que se extiende "ViewGroup" no tiene la propiedad

android: descenddantFocusability = "blocksDescendants" que evitan que el diseño del niño se concentre

O Añadir androide: enfocable = "true" a WEBVIEW

+0

buscó en mi proyecto para "descendienteFocusability" eliminó esa línea y finalmente funcionó. No estaba en una vista web y no estoy seguro de cómo terminó esa línea en el código fuente. – chaggy

1

Sólo añadir EditarTexto invisible bajo 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"/> 

Todas estas soluciones relacionadas Focus-no funcionó en mi Samsung Note 3/Android 5.0

Cuestiones relacionadas