Eu tenho um app que implementa um AutoCompleteTextView dentro de uma ActionBar. Estou usando o ActionBarSherlock, e este AutoComplete é invocado pela tag
android:actionLayout="@layout/field_search"
de um item de um menu xml, como mostrado abaixo:
[code]<?xml version="1.0" encoding="utf-8"?>
[/code]Quando o ícone de pesquisa é clicado, o teclado é mostrado para o usuário. Quando o usuário escolhe um item, o conteúdo do AutoComplete é modificado para o nome do item escolhido, e o teclado é escondido. Bem, essa é a parte que funciona bem.
O que não está funcionando é que o teclado só é escondido em eventos de clique do AutoComplete. Então, se eu clico no ícone de pesquisa e não escolho um item do AutoComplete, e então clico no botão “home” da ActionBar (para fechar a Activity corrente), o teclado não é fechado. Ele se mantém aberto.
Estou setando o evento de clique do botão “home” (da ActionBar) pelo método abaixo:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Action bar back button.
case android.R.id.home:
onBackPressed();
return true;
case R.id.autocomplete_menu_item:
initializeAutoComplete();
return true;
// Default.
default:
return super.onOptionsItemSelected(item);
}
}
Bom, o método onBackPressed() está sendo chamado, mas o teclado não está sendo fechado.
Então, tentei fechar o teclado pelo evento onPause(), como mostrado abaixo:
[code]@Override
protected void onPause() {
super.onPause();
// Closes keyboard before exit.
if (mKeyboardShown)
hideKeyboard(mAutoComplete);
}[/code]
E de novo o teclado não está sendo fechado.
Os métodos que abrem e fecham o teclado são mostrados abaixo:
[code]/**
- Shows the keyboard.
-
@param view
*/
public void showKeyboard(View view) {
Context context = view.getContext();
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
- Hides the keyboard.
-
@param view
*/
public void hideKeyboard(View view) {
Context context = view.getContext();
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}[/code]
O método que configura o AutoCompleteTextView é mostrado abaixo.
[code]/**
-
Calls the auto complete text view.
*/
public boolean initializeAutoComplete() {
if (mAutoComplete == null) return false;// Cleans text.
mAutoComplete.setText("");// Invoke virtual keyboard.
mAutoComplete.requestFocus();
showKeyboard(mAutoComplete);
mKeyboardShown = true;// Creates an array adapter to display the school units from the auto complete text view.
final AutoCompleteAdapter adapter = new AutoCompleteAdapter(this, mList);// Sets the click listener of the auto complete text view, to show the keyboard when the auto complete
// text view has shown the keyboard and this keyboard was closed (so the auto complete text view is been
// shown, but the keyboard don’t, so we need to show it).
mAutoComplete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showKeyboard(mAutoComplete);
mKeyboardShown = true;
}
});// Sets the click listener of the auto complete text view, to set the adapter.
mAutoComplete.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// Populate list with our static array of titles.
mAutoComplete.setAdapter(adapter);return false; }});
// Sets the item click listener of the auto complete text view, to set the auto complete text view name,
// hide the keyboard, and hide the auto complete drop down.
mAutoComplete.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Get id of the unit from the adapter tag.
Integer nameId = (Integer)view.getTag();// Get clicked id of the auto complete text view. Data data = getDataById(nameId); if (data != null) mAutoComplete.setText(data.getName()); else mAutoComplete.setText("Data not found."); // Hide keyboard and hide auto complete drop down. hideKeyboard(mAutoComplete); mKeyboardShown = false; mAutoComplete.setDropDownHeight(0); }});
return true;
}[/code]
Bem, o teclado é mostrado toda vez que showKeyboard() é chamado, mas apenas é fechado quando eu chamo hideKeyboard() no evento de clique do AutoComplete. Parece que o método hideKeyboard() somente pega o “window token” quando o evento de clique é chamado. Mas eu preciso fechar o teclado quando eu quiser, e não apenas no evento de clique.
Nesse app existem 2 Activity: MainActivity e AutoCompleteActivity. Abaixo mostro uma imagem com 6 janelas (em ordem da esquerda para a direita, de cima para baixo), ilustrando as seguintes ações:
- Depois de entrar na AutoCompleteActivity.
- Depois de clicar no ícone de pesquisa (aqui o teclado é invocado).
- Depois de digitar algum texto, o AutoComplete mostra o que foi pesquisado pelo adapter.
- Depois de clicar em um item mostrado pelo AutoComplete, o texto do AutoComplete é atualizado com o nome do item escolhido (neste caso, com “Apple”).
- Depois de clicar no botão “back” da ActionBar, o AutoComplete é ocultado, mas não o teclado, mesmo tendo sido chamado o onBackPressed() (quando o evento onOptionsItemSelected() é chamado).
- Clicando no botão “back” da ActionBar de novo, estamos de volta à MainActivity. Mas o teclado permanece na tela, mesmo após o evento onPaused() do AutoCompleteActivity ser chamado. Como isso pode acontecer?
Como posso solucionar esse problema?
