Espacio vacío cuando vuelvo a Actividad (Soft Keyboard forzado)
Tengo un ActionView
con el elemento de menú en ActionBar
(con ActionBarSherlock ), Soy capaz de mostrar un EditText
como un campo de búsqueda en él. Es una entrada para iniciar otra Activity
con un CustomView
en ActionBar que muestra el mismo diseño (no uso nada para forzar el SoftKeyboard
a aparecer en esta segunda actividad, no hay ningún problema aquí). Cuando quiero hacer que el Softkey aparezca / disapears automáticamente cuando el colapso de la vista en la primera actividad, uso:
Método openKeyboard
- Uso de capa de hardware en vista personalizada onDraw
- ¿Cómo obtener el contenido de una pestaña dentro de TabHost?
- Android: programaticamente setId es da una advertencia Esperado recurso de tipo id
- Vista personalizada de Android delegado de grupo addView
- ¿Cómo puedo definir el tamaño de los dibujables en el archivo de estilo?
mImm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
Método closeKeyboard
mImm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
Utilizo ActionExpandListener
para hacer que el SoftKeyboard aparezca o desaparece cuando la View
expande o contrae. Con estos dos métodos anteriores, tengo el resultado esperado. He encontrado esto en varias preguntas sobre SO (especialmente en Cerrar / Ocultar el teclado suave de Android y mostrar el teclado virtual para SearchView en ActionBar o forzar el teclado virtual abierto ).
Sólo para entender, cuando utilicé SHOW_IMPLICIT
o SHOW_FORCED
solo, no tenía efecto en versiones inferiores (como 2. +). El EditText estaba enfocado, pero el teclado no apareció (así, supongo que fue una mala cosa). En versiones recientes (como 4. + por ejemplo), fue un buen efecto y no hay problema. Entonces, forcé el teclado a aparecer con el método openKeyboard anterior.
Ahora, tengo algunos problemas con esto …
En versiones inferiores, tengo espacio "vacío" antes y después del teclado creado / destruido, puedo vivir con esto. PERO en las versiones recientes, tengo espacio "vacío" que se muestra cuando vuelvo a la primera Actividad . Y es aquí en menos de un segundo, pero suficiente para ver eso!
Para entender mejor lo que sucede, vea la siguiente imagen:
1. Segunda Actividad: Presiono el Botón Inicio – el teclado desaparece correctamente.
2. (volver a) Primera actividad: mi ListView está cubierto por un espacio "vacío" (color de fondo en mi aplicación). Y desaparece (esta es la misma altura del SoftKeyboard, no hay duda posible!)
Supongo que es porque forcé el teclado a aparecer en mi primera actividad aunque también forcé el teclado a esconderme cuando voy el segundo, pero ¿cómo puedo resolver el espacio "vacío" cuando vuelvo a la primera actividad?
Resumen
1) Una actividad => presione el elemento en el menú> ver colapso> mostrar el teclado> teclear texto> enviarlo> ocultar teclado> iniciar actividad B.
2) Actividad B => setCustomView en la barra de acciones> mostrar el teclado sólo si el edittext está enfocado / pulsado> teclear texto> enviarlo> ocultar teclado> actualizar contenido> pulsar el botón home> volver a una actividad
3) Una pantalla de actividad => pantalla "vacía" desaparece.
Cualquier ayuda será muy apreciar.
Gracias por tu tiempo.
EDITAR
Añado mi código de mi primera clase, para ver si alguien me dice lo que estoy haciendo mal. Tal vez es mi código lo que hace que el problema.
Menú (ActionView)
ActionBar actionBar; MenuItem itemSearchAction; EditText mSearchEdit; InputMethodManager mImm; @Override public boolean onCreateOptionsMenu(final Menu menu) { getSupportMenuInflater().inflate(R.menu.main, menu); itemSearchAction = menu.findItem(R.id.action_search); View v = (View) itemSearchAction.getActionView(); mSearchEdit = (EditText) v.findViewById(R.id.SearchEdit); itemSearchAction.setOnActionExpandListener(this); return true; }
OnActionExpandListener
@Override public boolean onMenuItemActionExpand(MenuItem item) { actionBar.setIcon(R.drawable.ic_app_search); // change icon mSearchEdit.requestFocus(); // set focus on edittext openKeyboard(); // the method above mSearchEdit.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { closeKeyboard(); // same method as above // new Intent() to second activity // perform with startActivity(); itemSearchAction.collapseActionView(); // collapse view return true; } return false; } }); // add a clicklistener to re-open the keyboard on lower versions mSearchEdit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openKeyboard(); } }); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { actionBar.setIcon(R.drawable.ic_app_logo); // change icon again if(!(mSearchEdit.getText().toString().equals(""))) mSearchEdit.setText(""); // reinitial the edittext return true; }
OnOptionsItemSelected
// I had this verification when I make new Intent() to // a new activity, just in case (works like a charm) if(itemSearchAction.isActionViewExpanded()) itemSearchAction.collapseActionView();
ActionView (elemento + diseño)
<item android:id="@+id/action_search" android:icon="@drawable/ic_app_search" android:title="@string/action_search" android:showAsAction="ifRoom|collapseActionView" android:actionLayout="@layout/search_actionview" /> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/SearchEdit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:gravity="left" android:layout_marginBottom="6dip" android:hint="@string/action_search" android:textColor="@color/white" android:textColorHint="@color/white" android:singleLine="true" android:cursorVisible="true" android:inputType="text" android:imeOptions="actionSearch|flagNoExtractUi" android:imeActionLabel="@string/action_search" android:focusable="true" android:focusableInTouchMode="true" android:background="@drawable/bt_edit_searchview_focused" > <requestFocus /> </EditText>
ACTUALIZAR
Puedo ver un montón de problemas similares, con EditText
en ActionBar
que no hace que el teclado aparezca incluso el enfoque se ha establecido. He intentado esto de nuevo (incluso si ya he probado varias veces):
/* * NOT WORKING * Sources: https://stackoverflow.com/questions/11011091/how-can-i-focus-on-a-collapsible-action-view-edittext-item-in-the-action-bar-wh * https://stackoverflow.com/a/12903527/2668136 */ int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE; getWindow().setSoftInputMode(mode); postDelayed() to show: .showSoftInput(mSearchEdit, InputMethodManager.SHOW_IMPLICIT); - 200ms (Not working on lower versions) postDelayed() to hide: .hideSoftInputFromWindow(mSearchEdit.getWindowToken(), 0); - 200ms new Runnable() on edittext => requestFocus() + showSoftInput(SHOW_IMPLICIT/FORCED/HIDE_NOT_ALWAYS/HIDE_IMPLICIT_ONLY)
Parece conmigo, sólo SHOW_FORCED|HIDE_IMPLICIT_ONLY
puede forzar el teclado a mostrar automáticamente cuando el colapso de vista. Después de esto, en todas las versiones, debo hacer un hideSoftInputFromWindow
a 0 para ocultarlo.
PERO esto no exhibe el teclado incluso si el edittext se presiona, así que agregué un ClickListener
para forzar el teclado para demostrar otra vez (esto sucede solamente en versiones más bajas).
UPDATE2:
Es claramente raro, cuando trato de hacer un poco de Thread
como vi en muchas respuestas SO (con / sin ABS), nada sucede en versiones inferiores.
Intenté una manera diferente. He creado el nuevo hilo para tener un poco de tiempo antes de llamar a la nueva intención de ocultar el teclado. Tuve el teclado que obligó a cerrar, OK. Y luego abrí la nueva actividad, OK. Pero ahora cuando vuelva, vale la pena! El espacio "vacío" también está en las versiones inferiores cuando regreso. Hice esto:
// close the keyboard before intent closeKeyboard(); // make the intent after 500 ms Handler handler = new Handler(); Runnable runner = new Runnable() { public void run() { // new intent with startActivity() } }; handler.postDelayed(runner, 500); // collapse the View itemSearchAction.collapseActionView();
Me da dolores de cabeza! No entiendo por qué en mi caso, la punta de arriba no funciona, mientras que en otras respuestas, cuando se utiliza un nuevo hilo para mostrar / ocultar el teclado, esto funciona perfectamente.
NOTA: mis pruebas estaban encendidas (emulador 🙂 GalaxyNexus, NexusS, NexusOne y (dispositivos reales 🙂 Samsung GalaxySL (2.3.6) y Nexus4 (4.4).
Si alguien me puede ayudar con esta situación fea. Gracias por adelantado.
- Botones flotantes de Android sobre una vista
- Uso de forceLayout (), requestLayout () e invalidate ()
- Detectar clics largos en una vista personalizada?
- Reemplazando View.onSaveInstanceState () y View.onRestoreInstanceState () utilizando View.BaseSavedState?
- Cómo cambiar el color del marcador actual de la pestaña en Android ViewPager?
- Cookies HTTP WebView HTTP no funcionan en la API 21
- Android - Javascript: cómo ejecutar jquery en webview
- Android - Color de fondo con diferentes colores y ángulos
¿Has probado este?
setContentView(R.layout.activity_direction_3); getWindow().getDecorView().setBackgroundColor( android.R.color.transparent);
Quitar Tema translúcido:
android:theme="@style/Theme.AppCompat.Translucent"
Y usa tu Activity
en manifest.xml como:
<activity android:name=".SearchActivity" android:screenOrientation="portrait">