Android: ¿Cómo rastrear si el teclado virtual está abierto?

En mi aplicación, el dispositivo de teclado está cubriendo el EditTextViews, por lo que el usuario no puede ver lo que está escribiendo.

Así que quiero ocultar otras vistas (como un botón en mi caso), para hacer la EditTextViews visible.

Pero en vez de hacer algo como

EditText.onFocus(){ //hide button } 

Para cada EditText, quiero hacer algo como

 if(soft-keyboard.isOpenned()) //hide button } 

¿Cómo rastrear si el soft-keyboard está abierto o cerrado?

Editar:

En realidad, mi diseño es el siguiente:

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="0dp" android:layout_height="0dp" android:background="@android:color/transparent" android:focusable="true" android:focusableInTouchMode="true" > </LinearLayout> <ImageView android:id="@+id/Logo" android:layout_width="45dp" android:layout_height="45dp" android:src="@drawable/wic_logo_small" /> <Button android:id="@+id/goButton_iWant" android:layout_width="35dp" android:layout_height="45dp" android:layout_alignParentRight="true" android:background="@color/black" android:gravity="center_vertical|center_horizontal" android:text="@string/go" /> <AutoCompleteTextView android:id="@+id/searchAutoCompleteTextView_iWant" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@id/goButton_iWant" android:layout_toRightOf="@id/Logo" android:hint="@string/search" android:textColor="@color/white" /> <TextView android:id="@+id/iWantLabel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/iWantPageLogo" android:background="@color/grey" android:gravity="center_vertical|center_horizontal" android:text="@string/iWant" android:textColor="@color/white" /> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ScrollViewiWant" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/iWantLabel" android:scrollbars="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/iNeedToBuy" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/iWantLabel" android:gravity="center_vertical|center_horizontal" android:padding="5dp" android:text="@string/iNeedToBuy" android:textColor="@color/white" android:textSize="20dp" /> <AutoCompleteTextView android:id="@+id/iNeedToBuyEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/iNeedToBuy" android:hint="@string/product" android:imeOptions="actionNext" android:singleLine="true" android:textColor="@color/white" android:textSize="15dp" /> <TextView android:id="@+id/error1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/iNeedToBuyEditText" android:height="0dp" android:text="" android:textColor="@color/error_color" android:textSize="12dp" /> <TextView android:id="@+id/priceWillingToPay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/error1" android:gravity="center_vertical|center_horizontal" android:text="@string/priceWillingToPay" android:textColor="@color/white" android:textSize="20dp" /> <EditText android:id="@+id/priceWillingToPayEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/priceWillingToPay" android:hint="@string/price" android:inputType="number" android:singleLine="true" android:textColor="@color/white" android:textSize="15dp" /> <TextView android:id="@+id/error2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/priceWillingToPayEditText" android:height="0dp" android:text="" android:textColor="@color/error_color" android:textSize="12dp" /> <TextView android:id="@+id/needToBuyItBy" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/error2" android:gravity="center_vertical|center_horizontal" android:text="@string/needToBuyItBy" android:textColor="@color/white" android:textSize="20dp" /> <EditText android:id="@+id/date_iWant" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/needToBuyItBy" android:clickable="true" android:cursorVisible="false" android:focusable="false" android:hint="@string/date" android:inputType="none" android:singleLine="true" android:textColor="@color/white" android:textSize="15dp" /> <TextView android:id="@+id/error3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/date_iWant" android:height="0dp" android:text="" android:textColor="@color/error_color" android:textSize="12dp" /> <DatePicker android:id="@+id/datePicker_iWant" android:layout_width="0dp" android:layout_height="0dp" android:layout_below="@id/error3" android:hint="@string/date" android:padding="5dp" android:textColor="@color/black" android:textSize="15dp" /> <TextView android:id="@+id/iAmIn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/date_iWant" android:gravity="center_vertical|center_horizontal" android:text="@string/iAmIn" android:textColor="@color/white" android:textSize="20dp" /> <Spinner android:id="@+id/city_spinner_iWant" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/iAmIn" android:prompt="@string/citySpinner" android:textColor="@color/white" android:textSize="20dp" /> <Button android:id="@+id/submitButton_iWant" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/city_spinner_iWant" android:gravity="center_vertical|center_horizontal" android:text="@string/submit" android:textColor="@color/white" android:textSize="20dp" /> <TextView android:id="@+id/emptySpace" android:layout_width="wrap_content" android:layout_height="50dp" android:layout_below="@id/submitButton_iWant" android:gravity="left" /> </RelativeLayout> </ScrollView> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/buttons_iWant" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <Button android:id="@+id/feedButton_iWant" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_margin="0dp" android:layout_weight="1" android:background="@color/white" android:text="@string/feed" android:textColor="@color/black" /> <Button android:id="@+id/iWantButton_iWant" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_margin="0dp" android:layout_weight="1" android:background="@color/white" android:text="@string/iwant" android:textColor="@color/black" /> <Button android:id="@+id/shareButton_iWant" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_margin="0dp" android:layout_weight="1" android:background="@color/white" android:text="@string/share" android:textColor="@color/black" /> <Button android:id="@+id/profileButton_iWant" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_margin="0dp" android:layout_weight="1" android:background="@color/white" android:text="@string/profile" android:textColor="@color/black" /> </LinearLayout> </RelativeLayout> 

El problema viene cuando estoy escribiendo texto en el EditTextViews en el ScrollView

No hay manera directa de encontrarlo, pero me sale con una solución sucia y funciona bien. La idea detrás es comparar la altura de dos vistas su actividad y teclado.

 boolean watcherState; private void isShowing() { final RelativeLayout relative = (RelativeLayout) findViewById(R.id.parent); relative.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); // r will be populated with the coordinates of your view // that area still visible. relative.getWindowVisibleDisplayFrame(r); int heightDiff = relative.getRootView().getHeight() - (r.bottom - r.top); Log.d("Height", heightDiff + "//"); if (heightDiff > 100) { // if more than 100 pixels, its // probably a keyboard... watcherState = true; } else watcherState = false; } }); } 

Probablemente debería usar el atributo android:windowSoftInputMode en el archivo de manifiesto para describir cómo debe configurarse el diseño de la pantalla cuando aparezca el teclado android:windowSoftInputMode ( http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft )

  • android:windowSoftInputMode="adjustResize" :

La ventana principal de la actividad siempre se redimensiona para hacer espacio para el teclado virtual en la pantalla.

  • android:windowSoftInputMode="adjustPan"

La ventana principal de la actividad no se redimensiona para hacer espacio para el teclado suave. Por el contrario, el contenido de la ventana se cuelga automáticamente para que el enfoque actual nunca sea oscurecido por el teclado y los usuarios siempre pueden ver lo que están escribiendo. Esto es generalmente menos deseable que el cambio de tamaño, porque el usuario puede necesitar cerrar el teclado suave para obtener e interactuar con partes oscurecidas de la ventana.

Para manejar la detección de softkepad, establezca el atributo android:ConfigChanges para su actividad en el archivo AndroidManifest.xml :

 <activity android:name="com.myapp.MyActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Aquí, el keyboard|keyboardHidden flag en android:configChanges le dice al sistema que la Actividad desea invocar el método onConfigurationChanged() de su Actividad en su lugar, lo que le permite manejar los cambios de softkebaord.

He aquí un ejemplo onConfigurationChanged() que reemplaza la vista de contenido principal de la actividad en ejecución:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Set a new layout - framework will automatically choose portrait or landscape as needed setContentView( R.layout.my_activity_layout ); // Reconnect all listeners for controls in the layout a.findViewById( R.id.exit_button ).setOnClickListener( mListener ); } 

Las probabilidades son, su método onConfigurationChanged() tendrá que hacer casi exactamente el mismo tipo de trabajo que el método onCreate() su actividad, por lo que es probablemente una buena idea para secar su código por factoring su configuración de diseño en un método auxiliar separado que Invocamos desde onCreate() y onConfigurationChanged() .

  • Haga clic automáticamente en Button si EditText es correcto
  • EditText lineSpacingExtra comportamiento extraño
  • Pop up árabe / urdu teclado personalizado en editext cuestión
  • Android Edittext- Expansión de vanos
  • ¿Cómo eliminar inmediatamente el espacio de un edittext si un usuario presiona el espacio?
  • Después de pulsar una tecla, la vista desciende, sólo en S3
  • Cómo aplicar estilo personalizado global a android.support.design.widget.TextInputEditText?
  • Android IME, establece la posición del cursor en EditText
  • ¿Cómo evitar cortar / copiar / pegar en teléfono inteligente después de puerto de rotación para aterrizar en Android4.X?
  • ¿Cambiar el color del texto mientras el usuario está escribiendo?
  • Agregar EditText a la barra de herramientas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.