Esconder teclado do auto complete do Action Bar Sherlock não funciona

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:

  1. Depois de entrar na AutoCompleteActivity.
  2. Depois de clicar no ícone de pesquisa (aqui o teclado é invocado).
  3. Depois de digitar algum texto, o AutoComplete mostra o que foi pesquisado pelo adapter.
  4. Depois de clicar em um item mostrado pelo AutoComplete, o texto do AutoComplete é atualizado com o nome do item escolhido (neste caso, com “Apple”).
  5. 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).
  6. 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?

amigo conseguiu solucionar seu problema…?

Não. O ActionBarSherlock é uma lib muito, muito interessante. Mas os bugs que ele tem são praticamente impossíveis de solucionar. É uma pena.

as vezes penso em abandonar essa sherlock… mais esta cedo ainda

tou tentanu coloca um simples botão nela para abrir o email… o botão ate aparece normal… mais a ação não acontece…
sabe me explicar exatamente onde coloco os comportamentos que vão acontecer na action bar…

poderia colocar sua classe inetria onde vc monta sua actiom bar…

valew

Você quer clicar num botão que está na Action Bar Sherlock? É isso?

consegui

é que tinha que usar o “onOptionsItemSelected” e eu estava usando o onMenuItemclick

mais brigado pela atenção…

e quando resolver seu problema posta aqui

Que bom que conseguiu!

Se eu conseguir eu aviso.