Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android show softkeyboard con showSoftInput no funciona?

He creado una aplicación trivial para probar la siguiente funcionalidad. Cuando se inicia mi actividad, debe iniciarse con el teclado virtual abierto.

Mi código no funciona ?!

He intentado varias configuraciones del "estado" en el manifiesto y los diversos indicadores en el código al InputMethodManager (imm).

He incluido el ajuste en el AndroidManifest.xml y explícitamente invocado en el onCreate de la única actividad.

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.android.studyIme" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".StudyImeActivity" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

… el diseño principal (main.xml) …

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/edit_sample_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/hello" android:inputType="textShortMessage" /> </LinearLayout> 

… y el código …

 public class StudyImeActivity extends Activity { private EditText mEditTextStudy; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mEditTextStudy = (EditText) findViewById(R.id.edit_study); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mEditTextStudy, InputMethodManager.SHOW_FORCED); } } 

  • Los puntos de interrupción de SampleSyncAdapter no funcionan
  • Cómo abrir una aplicación Android SDK de ejemplo en Eclipse
  • Android muestra código bluetooth para enviar una cadena simple a través de bluetooth
  • Strange FragmentTransaction en la clase FragmentLayout del ejemplo ApiDemos
  • 7 Solutions collect form web for “Android show softkeyboard con showSoftInput no funciona?”

    Oye, espero que sigas buscando la respuesta como la encontré al probar mi código. Aquí está el código:

     InputMethodManager imm = (InputMethodManager)_context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, 0); 

    Aquí está mi pregunta que se respondió: androide – mostrar teclado suave a la carta

    Cuando se inicia la actividad Parece que el teclado se muestra inicialmente pero se oculta por otra cosa, porque lo siguiente funciona (pero en realidad es un trabajo sucio):

    Primer método

     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); editText.postDelayed(new Runnable() { @Override public void run() { editText.requestFocus(); imm.showSoftInput(editText, 0); } }, 100); 

    Segundo método

    In onCreate para lanzarlo en la actividad create

     new Handler().postDelayed(new Runnable() { @Override public void run() { // InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // inputMethodManager.toggleSoftInputFromWindow(EnterYourViewHere.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0); if (inputMethodManager != null) { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); } } }, 200); 

    Tercer método AÑADIR código dado a la etiqueta de actividad en Manifest. Mostrará el teclado en el lanzamiento, y fijará el primer foco a su opinión del deseo.

     android:windowSoftInputMode="stateVisible" 

    Esto es tan sutil, que es criminal. Esto funciona en los teléfonos que NO tienen un teclado duro y deslizable. Los teléfonos con teclado duro no se abren automáticamente con esta llamada. Mi LG y el viejo Nexus One no tienen teclado – por lo tanto, el teclado virtual se abre cuando se inicia la actividad (eso es lo que quiero), pero los teléfonos MyTouch y HTC G2 que tienen teclados deslizantes no abren el soft Teclado hasta que toque el campo de edición con el teclado duro cerrado.

    Esto funcionó conmigo en un teléfono con teclado duro:

     editText1.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 

    Esta respuesta tal vez tarde, pero funciona perfectamente para mí. Tal vez ayude a alguien 🙂

     public void showSoftKeyboard(View view) { if (view.requestFocus()) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); boolean isShowing = imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); if (!isShowing) getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } } 

    Depende de lo que necesites, puedes usar otras banderas

     InputMethodManager.SHOW_FORCED WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

    Mi código tenía el toggle en él pero no postDelayed. Yo había probado postDelayed para el showSoftInput sin éxito y desde entonces he intentado su solución sugerida. Estaba a punto de descartarlo como otra solución potencial fallida hasta que decidí aumentar el tiempo de retardo. Funciona para mí todo el camino hasta 200 ms en que punto no funciona, al menos no en los teléfonos físicos. Así que antes de que los pobres desarrolladores de Android se quitan esta respuesta, intente aumentar el retraso para una solución exitosa. Puede pagar para agregar un poco para los teléfonos más lentos más viejos. Gracias montones, estaba trabajando en este por horas.

    Mostrando Soft Keyboard es un gran problema. Busqué mucho para llegar a una conclusión final. Gracias a esta respuesta que dio una serie de pistas: https://stackoverflow.com/a/16882749/5903344

    Problema:

    Normalmente llamamos a showSoftInput tan pronto como inicializamos las vistas. En Actividades, esto es principalmente en onCreate, en Fragments onCreateView. Para mostrar el teclado, IMM necesita tener focsedView como activo. Esto se puede comprobar con el método isActive (view) de IMM. Si llamamos a showSoftInput mientras se están creando las vistas, existe una buena probabilidad de que la vista no esté activa para IMM. Esa es la razón por la que a veces un demora de 50 a 100 ms showSoftInput es útil. Sin embargo, eso todavía no garantiza que después de 100 ms la vista se active. Así que en mi entendimiento, esto es de nuevo un hack.

    Solución:

    Utilizo la clase siguiente. Esto sigue funcionando cada 100 ms hasta que el teclado se ha demostrado con éxito. Realiza varias comprobaciones en cada iteración. Algunos cheques pueden detener la ejecución, algunos lo publican después de 100 ms.

     public class KeyboardRunnable extends Runnable { // ----------------------- Constants ----------------------- // private static final String TAG = "KEYBOARD_RUNNABLE"; // Runnable Interval private static final int INTERVAL_MS = 100; // ----------------------- Classes ---------------------------// // ----------------------- Interfaces ----------------------- // // ----------------------- Globals ----------------------- // private Activity parentActivity = null; private View targetView = null; // ----------------------- Constructor ----------------------- // public KeyboardRunnable(Activity parentActivity, View targetView) { this.parentActivity = parentActivity; this.targetView = targetView; } // ----------------------- Overrides ----------------------- // @Override public void run() { // Validate Params if ((parentActivity == null) || (targetView == null)) { Dbg.error(TAG, "Invalid Params"); return; } // Get Input Method Manager InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); // Check view is focusable if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode())) { Dbg.error(TAG, "Non focusable view"); return; } // Try focusing else if (!targetView.requestFocus()) { Dbg.error(TAG, "Cannot focus on view"); Post(); } // Check if Imm is active with this view else if (!imm.isActive(targetView)) { Dbg.error(TAG, "IMM is not active"); Post(); } // Show Keyboard else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT)) { Dbg.error(TAG, "Unable to show keyboard"); Post(); } } // ----------------------- Public APIs ----------------------- // public static void Hide(Activity parentActivity) { if (parentActivity != null) { InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0); } else { Dbg.error(TAG, "Invalid params to hide keyboard"); } } // ----------------------- Private APIs ----------------------- // protected void Post() { // Post this aftr 100 ms handler.postDelayed(this, INTERVAL_MS); } } 

    Para usar esto, simplemente crea una instancia de esta clase. Pase la actividad padre y el targetView que tendría entrada de teclado y enfocar después. A continuación, publicar la instancia utilizando un controlador.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.