studio plain inputtype example edittext android android-widget

android - plain - Mantenga el estado de apertura/cierre del teclado para EditText cuando la aplicaciĆ³n llegue a primer plano



plain text android studio (6)

¿Ha intentado agregar el estado del teclado en el archivo Manifest en su actividad:

android:windowSoftInputMode="stateAlwaysVisible|adjustPan">

Esto se encargará de la parte de la rotación de su problema y también debería funcionar en onResume. StateAlwaysVisible iniciará el teclado en el onCrate y el adjustPan manejará la rotación.

Aquí hay una muestra de una de mis Actividades de mi archivo Manifest:

<activity android:name=".GMax3Main" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> <intent-filter> <action android:name="com.medeasy.GMax3.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

Espero que esto ayude.

En mi Clase de actividad abro mi softkeyboard en el método onCreate de mi clase así:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new UserSync().execute(); setContentView(R.layout.main); InputMethodManager imm = (InputMethodManager) GMax3Main.this.getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null){ imm.toggleSoftInput(InputMethodManager.RESULT_SHOWN, 0); }

Luego llamo a mi android:windowSoftInputMode="stateAlwaysVisible|adjustPan"> como se muestra arriba en mi archivo Manifest.

Tengo una Activity que se recrea en un cambio de configuración (deseado). Tengo un DialogFragment que llama a setRetainInstance(true) con un solo EditText en su diseño.

En el onActivityCreated de onActivityCreated llamo:

getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

A) Si abro el teclado, cuando pongo la aplicación en segundo plano y luego la traigo a Foregournd, quiero que se muestre el teclado .

B) Si cierro el teclado (EditText aún tiene el foco y muestra el cursor y el comportamiento deseado), quiero que el teclado aún se cierre si pongo la aplicación en segundo plano y luego la traigo al primer plano.

Parece que no puedo lograr tanto A) como B). El teclado siempre está cerrado cuando traigo la aplicación al primer plano. He intentado .SOFT_INPUT_STATE_ALWAYS_VISIBLE pero el teclado siempre está abierto.

Gracias de antemano por cualquier sugerencia sobre cómo podría lograr esto. También deseo mantener dicho estado de teclado en la rotación, pero lo dejo para otro día. Pedro

Editar Tenga en cuenta que no quiero evitar que la actividad se vuelva a crear en un cambio de configuración.

También experimenté con WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED que mantuvo el estado de apertura / cierre del teclado durante la rotación en un teléfono (diseño de panel único) pero a) no funcionó con un diseño de doble panel b) no mantuvo el estado del teclado cuando se trajo el Aplicación al primer plano.


Debería usar una bandera (boolean kbShowing) para mantener el estado actual del teclado, como establecer kbShowing = true cuando se muestre el teclado, de lo contrario establecer kbShowing = false .

onCreate

showKB(); // if keyboard is not showed automatically.

onRestart

if(kbShowing) showKb(); // if keyboard is not showed automatically. else hideKb(); // if keyboard is showed automatically.

Si no sabe cómo detectar cuándo se muestra u oculta el teclado, consulte la respuesta de Stefan sobre este tema ¿Cómo capturar el evento "mostrar / ocultar" del teclado virtual en Android?


Declare su EditText a nivel de clase ...

EditText editText;

Ahora anule el método de actividad onResume () y onPause () ...

@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); editText.requestFocus(); editText.postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); } }, 100); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); editText.postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager)getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 200); }

Este código funciona perfectamente para mí.

Disfrutar -: d


Extendería el enfoque de Wayne al sobrescribir y crear su propio widget EditText que debería usar en toda su aplicación.

public class PJLsEditText extends EditText { public PJLsEditText(Context context) { super(context); saveKbState(); } public PJLsEditText(Context context, AttributeSet attrs) { super(context, attrs); saveKbState(); } private void saveKbState() { //get keyboard state and set a flag either in a static class or as SharedPreference } // I''m not sure if EditText objects get destroyed on configuration change. // If so, you might need to overwrite the onConfigurationChanged method here, // as well... }

Supongo que esto debería ayudarte a saber siempre el último estado del teclado, incluso si se cambia a través de Diálogos. Puede ocultar o mostrar el teclado de acuerdo con este indicador en sus métodos onResume y onPause .


Hola en primer lugar gracias por una pregunta interesante. Me hizo experimentar con el código. Aquí estoy describiendo mi solución.

Para encontrar la solución tenía que saber dos cosas.

1. cómo detectar si un softkeyboard es visible o no

2. Cómo configurar softkeyboard visible u oculto.

Obtuve la solución en los siguientes pasos, después de buscar un poco, me di cuenta de que la mejor solución para detectar un estado de softkeyboardstate (visible / oculto) es usar ViewTreeObserver . Estoy apuntando directamente a una respuesta para saber si no lo sabes. Aquí está el link .

y para configurar el softkeyboardstate acabo de usar el método Window.setSoftInputMode .

y para conocer una interacción de usuario onUserInteraction método onUserInteraction

Mantuvo dos banderas. una bandera es para preservar keyboardstate otra es para saber si la aplicación fue a segundo plano o no

CÓDIGO:

1. variable declarada

int lastDiff = 0; volatile boolean flag = false; volatile int flag2 = 0;

2. ViewTreeObserver

activityRootView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView() .getHeight() - (r.bottom - r.top); if (lastDiff == heightDiff) return; lastDiff = heightDiff; Log.i("aerfin","arefin "+lastDiff); if (heightDiff > 100) { // if more than 100 pixels, its // probably a keyboard... flag2 = 0; } else { if (flag == false) flag2 = 1; } } });

3. Manejo de la interacción del usuario.

@Override public void onUserInteraction() { super.onUserInteraction(); flag = true; }

4. Finalmente onPause y onResume

@Override protected void onPause() { super.onPause(); flag = true; } @Override protected void onResume() { flag = false; switch (flag2) { case 0: getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); break; case 1: getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); break; default: break; } super.onResume(); }

Explicación:

Aquí utilicé dos banderas ( flag2 y flag ). flag2 conserva el estado del keyboardstate y la flag conserva si la aplicación pasa al fondo o si hay alguna interacción del usuario. flag se usa porque cuando la aplicación pasa al fondo, al principio oculta el teclado. Otras cosas se pueden entender fácilmente a partir del código anterior.

Prueba:

probado en s2 (ics), desire s (ics), galaxy y (2.3.6)

Comentario final:

Escribí el código rápidamente por lo que podría perderse alguna otra optimización. También puede haber posibilidad de casos excepcionales. Si la pantalla cambia por algún motivo que no sea el teclado, es posible que no pueda detectar el estado del teclado.


Probablemente yo verificaría en OnPause si el teclado estuviera abierto y estableciera una bandera (creo que solo hay formas de piratear esto como en el siguiente ejemplo):

final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... ... do something here } } });

De acuerdo con la respuesta aquí: ¿Cómo verificar la visibilidad del teclado del software en Android?

A continuación, establezca una de las siguientes configuraciones en onResume:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);