android - tapar - ¿Cómo puedo concentrarme en un elemento EditText de la vista de acción plegable en la barra de acción(cuando está expandida) y forzar la apertura del teclado virtual?
ocultar teclado android in fragment (3)
Funciona para mí también!
Para colapsar ActionView y ocultar el teclado, uso:
Configure el Oyente para capturar el botón de búsqueda (o cualquier otro) presione el teclado virtual, luego use collapseActionView()
:
searchText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
searchMenuItem.collapseActionView();
return true;
}
return false;
}
});
Luego escriba el código de ocultación del teclado en el método onMenuItemActionCollapse()
.
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
searchText.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchText.getWindowToken(), 0);
}
});
return true; // Return true to collapse action view
}
Estoy utilizando la excelente biblioteca ActionBarSherlock de Jake Wharton y tengo una vista de acción de búsqueda plegable. Quiero abrir el teclado virtual cuando se expande la vista de acción de búsqueda.
Podemos leer una forma recomendada de hacer esto en un mensaje de diálogo de diálogo en la publicación del blog " Uso de los cuadros de diálogo " de Google (modificado un poco para mejorar la legibilidad).
// Show soft keyboard automatically
mEditText.requestFocus();
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getDialog().getWindow().setSoftInputMode(mode);
Esto no parece funcionar cuando se expande y solicita el enfoque en una vista de acción de Editor de texto plegable . Actualmente tengo esto.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.my_activity, menu);
MenuItem menuItem = menu.findItem(R.id.menu_search);
final EditText searchText = (EditText) menuItem.getActionView();
menuItem.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchText.requestFocus();
int mode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
getWindow().setSoftInputMode(mode);
return true; // Return true to expand action view
}
});
}
Aquí está la definición de mi elemento de menú en el archivo xml del menú my_activity:
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_menu_search"
android:actionLayout="@layout/collapsible_edittext"
android:showAsAction="always|collapseActionView"
android:title="@string/menu_search"/>
... y el diseño de la acción collapsible_edittext
<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_search"
android:imeOptions="actionSearch"
android:inputType="text"
android:focusable="true"
android:focusableInTouchMode="true" />
Advertencia: no quiero forzar el teclado suave. Cuando el usuario tiene un teclado de hardware solicitando enfoque es suficiente.
¿Algún pensamiento de alguien?
Para una implementación más fácil de un elemento de búsqueda colapsable en su Barra de Acción, simplemente puede usar SearchView
que también está disponible en ActionBarSherlock ( com.actionbarsherlock.widget.SearchView
).
Viene con muchos métodos prácticos y manijas que muestran / ocultan el teclado del software al expandir / contraer la vista automáticamente. Además, es más fácil definir qué hacer al enviar la búsqueda. Simplemente eche un vistazo a todos los oyentes que puede configurar en ese SearchView
.
Aquí hay un ejemplo:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SearchView searchView = new SearchView(this);
searchView.setQueryHint(getString(R.string.search_hint));
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// what to do on submit, e.g. start an Activity and pass the query param
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
menu.add(getString(R.string.search_title))
.setIcon(R.drawable.ic_action_search)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
// ...place to add other menu items
return super.onCreateOptionsMenu(menu);
}
Otra buena razón: tuve algunos problemas de diseño en dispositivos antiguos al usar un texto de EditText
personalizado como mi vista de búsqueda (como lo hizo en su pregunta). El SearchView
predeterminado resolvió todos estos problemas y me ahorró muchas líneas de código.
Tal vez el requestFocus nunca ocurrió en el código en la pregunta porque el searchText no se expandió todavía? No sé, de todos modos ... esto funcionó para mí:
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchText.post(new Runnable() {
@Override
public void run() {
searchText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT);
}
});
return true; // Return true to expand action view
}