AdjustResize con animación

He utilizado android: windowSoftInputMode = "adjustResize" en el manifiesto para evitar que el teclado oculte el botón de actividad. Funciona, pero cuando el teclado se abre, mi botón se mueve hacia arriba. Es un poco nervioso, quería saber – ¿puedo tener alguna animación para que la transición sin problemas?

<activity android:name=".Activity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"> </activity> 

El método setSoftInputMode(int) no puede ser anulado, su implementación está dentro de la clase Window y no creo que sea posible reemplazar la ventana actual por la suya. No se puede administrar esto desde WindowManager también.
Podría crear un listener en un ViewGroup y captar el diseño de la modificación cuando el SoftKeyboard está abriendo y cerrando. De hecho, cuando aparece el SKB, el diseño del contenedor se vuelve a dibujar y cambia su altura. A partir de este evento, usted podría manejar para establecer una Animation en vistas niño y hacer un efecto suave.

Edit: La solución utilizando un GlobalLayoutListener en la vista de root también es posible en lugar de (la solución presentada a continuación 🙂 la creación de una clase de grupo de vista personalizado.

Debe crear su propio grupo de vistas y convertirlo en un contenedor principal en el diseño. Implementará una interfaz que se manejará en la clase de interfaz de usuario ( Activity , Fragment , lo que sea). Encontré este blog para detectar los eventos en SKB para (~) todas las versiones . Según él, aquí está la clase del viewgroup para manejar los cambios de la altura:

 public class ContainerViewHandler extends RelativeLayout { private boolean isKeyboardShown; private onKeyboardStateChange listener; public ContainerViewHandler(Context context) { super(context); } public ContainerViewHandler(Context context, AttributeSet attrs) { super(context, attrs); } public ContainerViewHandler(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setKeyboardStateListener(onKeyboardStateChange listener) { this.listener = listener; } // Callbacks public interface onKeyboardStateChange { void onKeyboardShow(); void onKeyboardHide(); } @Override public boolean dispatchKeyEventPreIme(@NonNull KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { // Keyboard is hiding if (isKeyboardShown) { isKeyboardShown = false; listener.onKeyboardHide(); } } return super.dispatchKeyEventPreIme(event); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int proposedHeight = MeasureSpec.getSize(heightMeasureSpec); final int actualHeight = getHeight(); if (actualHeight > proposedHeight) { // Keyboard is showing if (!isKeyboardShown) { isKeyboardShown = true; listener.onKeyboardShow(); } } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Ahora, debe agregar este grupo de vistas en el diseño (por ejemplo, <com.package.name.ContainerViewHandler .../> ). A continuación, debe implementar la interfaz setKeyboardStateListener anterior en la actividad, como la siguiente:

 ContainerViewHandler containerView = (ContainerViewHandler) findViewById(R.id.container_view); containerView.setKeyboardStateListener(new ContainerHandler.onKeyboardStateChange() { @Override public void onKeyboardShow() { Log.v("onKeyboardShow()", "SoftKeyboard is showing. Hello!"); } @Override public void onKeyboardHide() { Log.v("onKeyboardHide()", "SoftKeyboard is hiding, Bye bye!"); } }); 

Por lo tanto, puede manejar diferentes animaciones para manejar y evitar que el botón "saltar" directamente por encima de la SKB. Para probar esto, intento reproducir un efecto de rebote:

Ejemplo de anitmación en el botón con AdjustResize

Así se ve mi implementación:

 containerView.setKeyboardStateListener(new ContainerViewHandler.onKeyboardStateChange() { @Override public void onKeyboardShow() { setAnimationUp(); } @Override public void onKeyboardHide() { setAnimationDown(); } }); private void setAnimationUp() { footerButton.setVisibility(View.GONE); float dpY = AppUtils.convertPxToDp(20, this); // custom conversion method Animation a1 = new TranslateAnimation(0, 0, footerButton.getHeight() * 4, -(dpY)); a1.setDuration(250); a1.setFillAfter(true); final Animation a2 = new TranslateAnimation(0, 0, -(dpY), 0); a2.setDuration(320); a2.setFillAfter(true); a1.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { footerButton.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { footerButton.startAnimation(a2); } @Override public void onAnimationRepeat(Animation animation) { } }); footerButton.startAnimation(a1); } private void setAnimationDown() { float dpY = AppUtils.convertPxToDp(30, this); // custom conversion method Animation b1 = new TranslateAnimation(0, 0, -(dpY), dpY); b1.setDuration(300); b1.setFillAfter(true); final Animation b2 = new TranslateAnimation(0, 0, dpY, 0); b2.setDuration(320); b2.setFillAfter(true); b1.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { footerButton.startAnimation(b2); } @Override public void onAnimationRepeat(Animation animation) { } }); footerButton.startAnimation(b1); } 

Comienzo configurando dos animaciones (a1, a2) en la primera devolución de llamada:

  • A1 : comienza por debajo (detrás) de la SKB (alrededor de 4xbutton's height ) y hasta 20dp encima de ella,
  • 20dp : comienza en 20dp y vuelve a 0dp (posición normal).

Y otros dos (b1, b2) en la segunda devolución de llamada:

  • B1 : comienza donde el botón está hasta 30dp en la parte superior y baja a 30dp fuera del contenedor padre,
  • B2: finalmente, de 30dp a 0dp (la posición inicial).

PS: no se olvide de usar adjustResize en el manifiesto y hacer que el contenido (por ejemplo, edittexts en mis pruebas) above el botón de pie de página que tiene alignParentBottom a true.

  • ¿Cómo puedo eliminar el teclado de muestra de Android?
  • EditText no es visible con el teclado abierto
  • Teclado rápidamente se oculta y reaparece en Android usando Xamarin Forms
  • El teclado suave androide arruina el diseño cuando aparece
  • Android adjustpan no funciona después de la primera vez
  • ¿Cómo mostrar el teclado suave en Android Things?
  • Cómo ocultar el BottomNavigationView debajo del teclado con el conjunto adjustResize
  • Android EditText, teclado suave mostrar / ocultar el evento?
  • Crear teclado personalizado en Android
  • Android IME, establece la posición del cursor en EditText
  • Mostrar múltiples líneas / varios caracteres como clave de etiqueta en las teclas del teclado suave
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.