android - personalizar - Ajustar el diseño cuando el teclado está encendido
gboard (6)
Aquí hay una solución que funciona como la pantalla de inicio de sesión de Evernote:
Primero, defina una clase que será su LinearLayout especial como esta:
public class MyLayout extends LinearLayout {
public MyLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLayout(Context context) {
super(context);
}
private OnSoftKeyboardListener onSoftKeyboardListener;
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
if (onSoftKeyboardListener != null) {
final int newSpec = MeasureSpec.getSize(heightMeasureSpec);
final int oldSpec = getMeasuredHeight();
if (oldSpec > newSpec){
onSoftKeyboardListener.onShown();
} else {
onSoftKeyboardListener.onHidden();
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) {
this.onSoftKeyboardListener = listener;
}
public interface OnSoftKeyboardListener {
public void onShown();
public void onHidden();
}
}
Este diseño escucha para medir los cambios, y si las nuevas medidas son <que las anteriores, eso significa que parte de la pantalla es consumida por el teclado virtual.
Sin embargo, para que funcione, en tu manifiesto debes configurar android:windowSoftInputMode="adjustResize"
para que el contenido android:windowSoftInputMode="adjustResize"
tamaño y no solo se cambie.
Y todo el sistema funciona de la siguiente manera: Usted tiene su diseño:
<MyLayout id="layout">
<SomeImage id="image"/>
<SomeText>
<SomeInput>
</MyLayout>
Es como la pantalla de inicio de sesión de evernotes. Entonces, en tu actividad:
((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() {
@Override
public void onShown() {
findViewById(R.id.image).setVisibility(View.GONE);
}
@Override
public void onHidden() {
findViewById(R.id.image).setVisibility(View.VISIBLE);
}
});
Luego ve a manifest.xml y establece
android:windowSoftInputMode="adjustResize"
Lo que sucederá es que cuando se muestre el teclado suave, ocultará la imagen y cambiará el tamaño del resto del contenido. (En realidad, puedes ver cómo se redimensiona el texto en Evernote)
La ocultación de la imagen es, por supuesto, una de las muchas cosas que puedes hacer. Pero debe tener cuidado, ya que los diferentes cambios de diseño también llamarán a OnMeasure.
Por supuesto, es una variante sucia. Necesita verificar los cambios de orientación, y el momento adecuado cuando realmente toma las medidas, y tal vez un poco más de lógica al comparar las nuevas especificaciones con las antiguas. Pero creo que esta es la única forma de hacerlo.
He visto en algunas aplicaciones que el diseño cambia cuando se muestra el teclado suave. Esto ciertamente no es adjustPan
porque el diseño completo (probablemente el diseño interno) cambia, no solo el EditText
actual. Esto es, por ejemplo, en la pantalla de inicio de sesión de Evernote. ¿Puedes decirme cómo fue esto?
Esto funcionó para mí ... Pero este es tu oncreate
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
La respuesta seleccionada no funciona para el modo de pantalla completa. Seguir la solución de una línea funcionó para mí:
AndroidBug5497Workaround.assistActivity(this);
copia la clase AndroidBug5497Workaround de:
Android Cómo ajustar el diseño en el modo de pantalla completa cuando el teclado está visible
Utilice "adjustResize" en lugar de "adjustPan" en AndroidManifest.xml
<activity
...
android:windowSoftInputMode="adjustResize" />
De la documentation :
"adjustResize"
La ventana principal de la actividad siempre se redimensiona para dejar espacio para el teclado virtual en la pantalla."adjustPan"
La ventana principal de la actividad no se redimensiona para dejar espacio para el teclado virtual. Más bien, el contenido de la ventana se panoramiza automáticamente para que el enfoque actual nunca se oculte por el teclado y los usuarios siempre pueden ver lo que escriben. En general, esto es menos conveniente que cambiar el tamaño, ya que el usuario puede necesitar cerrar el teclado virtual para acceder e interactuar con las partes oscuras de la ventana.
use la vista de desplazamiento en su diseño dentro del elemento principal y elimine la configuración ajustar o ajustar el tamaño del archivo de manifiesto. ScrollView en su diseño le brindará la funcionalidad gratuita para desplazarse por la bandeja o el diseño con el diseño dado y también protegerá su diseño para anular la barra de herramientas o la barra de acciones y tampoco ocultará los botones o campos de texto dentro del diseño. Recuerde que debe usar ScrollView dentro del diseño de la base, por lo que esta vista de desplazamiento funcionará como el diseño base para toda la pantalla. ejemplo
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:scrollbarStyle="insideInset"
android:scrollbars="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Add here which you want -->
</LinearLayout>
</ScrollView>