Estou tentando adicionar suporte para o SearchView
no Android 3.0+ ActionBar, mas não consigo fazer o OnCloseListener
trabalho.
Este é o meu código:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searchLibrary(newText);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) { return false; }
});
searchView.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
System.out.println("Testing. 1, 2, 3...");
return false;
}
});
return true;
}
A pesquisa funciona muito bem e todos estão funcionando, exceto o OnCloseListener
. Nada está sendo impresso no Logcat. Este é o Logcat para quando eu pressiono o botão "Fechar":
02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0
Verifiquei a documentação e as amostras, mas nada parecia mudar isso. Estou executando em um Asus Transformer Prime e um Galaxy Nexus, ambos no Ice Cream Sandwich. Alguma ideia?
Atualizar:
Sim - System.out.println()
faz o trabalho. Aqui está a prova:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Resultados neste Logcat:
02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello
showAsAction
estiver definido comoalways
. A caixa de pesquisa tem um botão Fechar próprio, mas se estiver definido paraifRoom | collapseActionView
expandir na barra de ação.Respostas:
Eu também encontro esse problema e não tenho escolha a não ser desistir de "oncloselistener". Em vez disso, você pode obter seu menuItem, então
setOnActionExpandListener
. Em seguida, substitua os métodos não implementados.fonte
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
Para Android API 14+ (ICS e superior), use este código:
Para obter mais informações: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse / onActionExpand
fonte
Para esse problema, pensei em algo assim,
fonte
Eu tive o mesmo problema no Android 4.1.1. Parece que é um bug conhecido: https://code.google.com/p/android/issues/detail?id=25758
De qualquer forma, como solução alternativa, usei o ouvinte de mudança de estado (quando SearchView é desanexado da barra de ação, ele também é fechado obviamente).
O código acima funcionou bem no meu caso.
Eu posto a mesma resposta aqui: https://stackoverflow.com/a/24573266/2162924
fonte
Acabei usando um pequeno hack, que funciona bem para o meu propósito - não tenho certeza se vai funcionar para todos os propósitos. De qualquer forma, estou fazendo uma verificação para ver se a consulta de pesquisa está vazia. Isso não está realmente relacionado ao do
SearchView
-OnCloseListener
mas ainda não funciona!fonte
Bem, isso resolveu meu problema:
Item de menu com
showAsAction="always"
e em atividade
fonte
always
valor doshowAsAction
atributo resolve o problema. O importante é que quando oalways
valor estáis not
presente emshowAsAction
, o expandidoSearchView
apresenta o botão Fechar (ícone de cruz) apenas se a consulta emSearchView
for String não nula. OSearchView.onCloseClicked
que lida com os eventos do botão Fechar informa esse retorno de chamadaOnCloseListener
é chamado apenas se a consulta estiver vazia, se não estiver - é limpo primeiro - mas então, depois de limpar a consulta, o botão Fechar desaparece e não podemos entregar oonClose
retorno de chamada paraOnCloseListener
A fim de fazer o
OnCloseListener
trabalho, certifique-se de queshowAsAction
está definido comoalways
no item de menu de pesquisa.fonte
Eu encontrei o mesmo problema com onCloseListener não invocar para o SearchView. Com base no problema de bug levantado em 25758 e em algumas postagens que li, para invocar onCloseListener, você precisa definir:
Mas, no meu caso, eu queria ter a visualização de pesquisa aberta e não iconificada o tempo todo. Consigo resolver isso adicionando mais uma linha abaixo:
O searchView.setIconified (false) fará com que o searchView seja aberto, apesar de definir o padrão para iconificado como verdadeiro na linha anterior. Dessa forma, consegui ter um SearchView que abre o tempo todo e fazer com que ele invoque onCloseListener.
fonte
Crie o item de menu com o
app:showAsAction
conjunto para sempre.Ao criar o
SearchView
noonCreateOptionsMenu
método, faça algo semelhanteO
search.setIconifiedByDefault(true)
precisa ser definido comotrue
para chamar oonClose()
métodoSearchView.OnCloseListener()
criado acima.fonte
Para
MenuItemCompat
problemas, adicionei ViewTreeObserver para rastrear o estado de visibilidade. Você pode verificar minha resposta aqui: https://stackoverflow.com/a/28762632/1633609fonte
O motivo de
OnCloseListener
não ser chamado é porque há um bug no código do Android - o listener só é chamado se você também chamarsetIconifiedByDefault(true)
.fonte
já parece um tópico antigo, mas achei que tinha o mesmo problema com a API 18 no começo. Depois de pesquisar no Google, encontrei este tópico, outra hora li o javadoc experimentado e erroneamente por algo que não pretendo entender totalmente no javadoc, o seguinte funciona para mim agora:
Joguei um pouco com verdadeiro / falso, isso de alguma forma faz a diferença, e funciona para mim agora. Com sorte, isso poderia economizar o tempo de alguém.
fonte
É uma solução alternativa, mas funcionou para mim
fonte
se você clicar em fechar searchView ->
D / clique: fechar clicado
fonte
Eu encontrei esse problema ao tentar detectar a exibição / rejeição do SearchView. Acabei usando um ouvinte diferente e funcionou para o que preciso:
fonte
Usei o botão Fechar SearchView e defini um setOnClickListener nele
fonte
Não há console no Android para fazer login. Em vez disso, use a estrutura de registro do Android:
Veja também esta pergunta: Por que "System.out.println" não funciona no Android?
fonte
Existem dois padrões comuns para
SearchView.setOnCloseListener()
. Isso é realmente verdade para todos os ouvintes, mas estou abordando sua pergunta especificamente. A primeira maneira é criar uma função de ouvinte e anexá-la a uma variável de membro, e a segunda é fazer a classe implementar a interface e fazer com que o manipulador seja uma função de membro.A criação de um objeto ouvinte tem a seguinte aparência:
A implementação do ouvinte no nível da classe se parece com isto:
Não vi nenhum exemplo que crie o
OnCloseListener
ad-hoc, como você fez em sua pergunta.fonte