2011-11-04 11 views
7

Tengo un WebView y algunos botones en mi diseño. Hay una etiqueta grande en mi WebView. Esta aplicación se usa para editar archivos de texto. Los botones se utilizan para afectar el área de texto dentro de mi WebView. Cuando el usuario presiona un botón (como un botón de flecha para mover la vista de texto) cierra el teclado. He usado toggleSoftInput, pero eso solo cambia el teclado para mostrar o no. Quiero que los botones dejen de ocultar el teclado virtual cuando se presiona el botón. No he encontrado nada sobre mi problema específico. He buscado durante semanas. ¿Alguien tiene alguna idea sobre cómo puedo evitar que mis botones oculten el teclado virtual en Android?Cómo evitar que los botones oculten el teclado suave en Android

Respuesta

4

La solución a su problema puede ser mantener el teclado siempre visible y dejar que el usuario lo cierre cuando se realizan las acciones.

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

Pruebe este código en el método onCreate() de su Actividad. Tenga en cuenta que si el usuario presiona el botón Cerrar en el teclado o el botón Atrás, debería cerrarlo. Y supongo que no deberías interferir con ese escenario. Y cuando las acciones están hechas, puede cerrar el teclado desde el código.

4

Estoy exactamente en el mismo barco, así que si alguna vez encuentras una solución ideal, me encantaría escucharla.

EDITAR: ¡Éxito! O mucho mejor que antes, de todos modos. Eliminé mi solución anterior, ya que esta es mejor.

Como se indica en https://stackoverflow.com/a/10536033/513038, loadData() oculta el teclado. Sin embargo,, descubrí que en el hideSoftKeyboard() de WebView, comprueba el InputMethodManager para ver si la vista web está activa, a través de imm.isActive (mWebView).

Por lo tanto, si cambia el foco a EditText antes de loadData(), y vuelve a cambiar a la WebView inmediatamente después, ¡el teclado se queda fijo! Cambia brevemente a mayúsculas, creo que al volver el enfoque a la vista web, (en realidad, esto no siempre parece suceder, depende) pero es mucho menos notable que el teclado parpadeando hacia atrás y hacia atrás.

La esencia de lo que debe suceder es la siguiente.

Extender WebView. Darle un campo EditarTexto:

public EditText mFocusDistraction; 

En el constructor, tienen las siguientes líneas:

mFocusDistraction = new EditText(context); 
addView(mFocusDistraction); 

Luego de anulación LoadURL():

public void loadUrl(String s) { 
    mFocusDistraction.requestFocus(); 
    super.loadUrl(s); 
    this.requestFocus(); 
} 

Eso debería hacerlo funcionar, básicamente. Es un poco buggy, sin embargo, lo que aquí es una clase más completa:

import android.app.Activity; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.webkit.WebView; 
import android.widget.EditText; 

public class WebViewMod extends WebView { 
    public EditText mFocusDistraction; 
    public Context mContext; 

    public WebViewMod(Context context) { 
     super(context); 
     init(context); 
    }  

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

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

    public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { 
     super(context, attrs, defStyle, privateBrowsing); 
     init(context); 
    } 

    public void init(Context context) { 
     // This lets the layout editor display the view. 
     if (isInEditMode()) return; 

     mContext = context; 

     mFocusDistraction = new EditText(context); 
     mFocusDistraction.setBackgroundResource(android.R.color.transparent); 
     this.addView(mFocusDistraction); 
     mFocusDistraction.getLayoutParams().width = 1; 
     mFocusDistraction.getLayoutParams().height = 1; 
    } 

    @Override 
    public void loadUrl(final String url) { 
     if (mContext instanceof Activity && this.isFocused()) { 
      ((Activity)mContext).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mFocusDistraction.requestFocus(); 
        WebViewMod.super.loadUrl(url); 
        WebViewMod.this.requestFocus(); 
       } 
      }); 
     } else { 
      super.loadUrl(url); 
     } 
    } 
} 
+2

esto tiene el problema de perder el foco de un campo de entrada/texto seleccionado previamente. 1) seleccione la entrada para escribir 2) loadUrl se llama 3) el teclado aún está activo, pero al escribirlo no hace nada (ya no está escribiendo en la misma entrada –

+0

@HaykSaakian ¿Realmente?No se; lo que tengo funciona para mí, y no creo que cometí ningún error cuando lo puse aquí. Supongo que está intentando escribir en la misma página web que está ejecutando loadUrl, ¿verdad? – Erhannis

+0

tal vez solo sea una pequeña ventana de tiempo, ¿y en su caso no lo nota? en mi caso tengo una página a la que llamo loadUrl muchas veces por segundo (página de chat que usa websockets java que inyectan mensajes utilizando loadUrl con javascript) –

0

Xamarin Android (Alternativa):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
Cuestiones relacionadas