poner - Android: ¿cómo puedo saber si el teclado virtual está mostrando o no?
teclado virtual android apk (4)
Aquí está el dilema: estoy mostrando una pantalla con 3 campos de entrada y 2 botones dentro de una pestaña (hay 3 pestañas en total, y están en la parte inferior de la pantalla). Los 2 botones se encuentran en la parte inferior izquierda y derecha de la pantalla, justo arriba de las pestañas. cuando hago clic en un campo de entrada, las pestañas y los botones están todos empujados hacia arriba en la parte superior del teclado.
Solo deseo presionar los botones hacia arriba y dejar las pestañas donde están originalmente, en la parte inferior. Estoy pensando en establecer la visibilidad de las pestañas en GONE una vez que determine que se está mostrando el teclado virtual, y la visibilidad en VISIBLE una vez que el teclado virtual se haya ido.
¿hay algún tipo de oyente para el teclado virtual, o tal vez el campo de entrada? ¿ OnFocusChangeListener
vez algún uso complicado de OnFocusChangeListener
para editar texto? ¿Cómo puedo determinar si el teclado es visible o no?
Determinar si el teclado se muestra no es posible aparentemente.
Es posible que desee deshabilitarlo todo junto con la etiqueta xml windowSoftInputMode
en su manifiesto: http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode . O puede echar un vistazo a cómo eliminar el foco para ocultar el teclado: Ocultar el teclado virtual en actividad sin ninguna operación de teclado .
Tampoco resolverá exactamente su problema. Recuerdo haber leído una entrada de blog que aconseja no usar pestañas en la parte inferior, en lugar de la parte superior de la pantalla, por razones de claridad de la interfaz de usuario. Te recomiendo que hagas un seguimiento de eso.
En mi última aplicación tuve algunos problemas para mostrar el teclado virtual, luego usé el siguiente código en mi archivo Manifest:
<activity android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" android:name=".rate.Calculator"/>
Esto podría ayudar a http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
El código del teclado está aquí, lo revisé un poco, pero me rendí, no veo que se envíen transmisiones que puedan ser de alguna utilidad, al menos aquí. Tal vez puedas encontrar un código de nivel inferior en el repositorio y encontrar un Intent útil que se esté enviando. El primer enlace puede decirle cuándo se hace visible, pero no estoy seguro de cómo saber cuándo se vuelve invisible.
Por lo que sé, no puedes.
Sin embargo, puede monitorear los cambios de tamaño de su diseño, y dado que la presentación del teclado es la causa principal de los cambios de tamaño, puede suponer que el teclado se muestra o no.
Aquí hay un código de ejemplo para monitorear los cambios de tamaño de un diseño. Solo use este diseño como el padre de su diseño original, y use su oyente. Si la altura ha disminuido, puede suponer que se muestra el teclado y, si se aumentó, puede suponer que se cerró.
public class LayoutSizeChangedSensorFrameLayout extends FrameLayout {
public enum SizeChange {
HEIGHT_INCREASED, HEIGHT_DECREASED, WIDTH_INCREASED, WIDTH_DECREASED
}
public interface OnLayoutSizeChangedListener {
void onSizeChanged(EnumSet<SizeChange> direction);
}
private OnLayoutSizeChangedListener mLayoutSizeChangeListener;
public LayoutSizeChangedSensorFrameLayout(final Context context) {
super(context);
}
public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attributeSet) {
super(context, attributeSet);
}
public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mLayoutSizeChangeListener != null) {
final EnumSet<SizeChange> result = EnumSet.noneOf(SizeChange.class);
if (oldh > h)
result.add(SizeChange.HEIGHT_DECREASED);
else if (oldh < h)
result.add(SizeChange.HEIGHT_INCREASED);
if (oldw > w)
result.add(SizeChange.WIDTH_DECREASED);
else if (oldw < w)
result.add(SizeChange.WIDTH_INCREASED);
if (!result.isEmpty())
mLayoutSizeChangeListener.onSizeChanged(result);
}
}
public void setOnLayoutSizeChangedListener(final OnLayoutSizeChangedListener layoutSizeChangeListener) {
this.mLayoutSizeChangeListener = layoutSizeChangeListener;
}
public OnLayoutSizeChangedListener getOnLayoutSizeChangeListener() {
return mLayoutSizeChangeListener;
}
}