Próbuję dodać obsługę SearchView
paska ActionBar systemu Android 3.0+, ale nie mogę go uruchomić OnCloseListener
.
Oto mój kod:
@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;
}
Wyszukiwanie działa świetnie i wszystko działa, z wyjątkiem OnCloseListener
. Nic nie jest drukowane do Logcat. Oto Logcat, kiedy naciskam przycisk „Zamknij”:
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
Przejrzałem dokumentację i próbki, ale wydawało się, że nic tego nie zmienia. Używam go na Asus Transformer Prime i Galaxy Nexus, oba na Ice Cream Sandwich. Jakieś pomysły?
Aktualizacja:
Tak - System.out.println()
ma pracę. Oto dowód:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Wyniki w tym 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
jest ustawione naalways
. Pole wyszukiwania ma własny przycisk zamykania , ale jeśli jest ustawioneifRoom | collapseActionView
, rozwija się na pasku akcji.Odpowiedzi:
Ja też spotykam się z tym problemem i nie mam innego wyjścia jak zrezygnować z „oncloselistener”. Zamiast tego możesz pobrać swoje menuItem
setOnActionExpandListener
. Następnie zastąp metody bezimplents.źródło
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
W przypadku interfejsu API systemu Android 14+ (ICS i nowszych) użyj tego kodu:
Więcej informacji: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse / onActionExpand
źródło
W przypadku tego problemu wymyśliłem coś takiego,
źródło
Napotkałem ten sam problem na Androidzie 4.1.1. Wygląda na to, że to znany błąd: https://code.google.com/p/android/issues/detail?id=25758
W każdym razie jako obejście zastosowałem nasłuchiwanie zmian stanu (gdy SearchView jest odłączony od paska akcji, jest również oczywiście zamknięty).
Powyższy kod działał dobrze w moim przypadku.
Tę samą odpowiedź zamieszczam tutaj: https://stackoverflow.com/a/24573266/2162924
źródło
Skończyło się na tym, że użyłem trochę hacka, który działa dobrze w moim celu - nie jestem pewien, czy zadziała we wszystkich celach. W każdym razie sprawdzam, czy zapytanie wyszukiwania jest puste. To naprawdę nie jest związany z
SearchView
„sOnCloseListener
chociaż - to nadal nie działa!źródło
Cóż, to rozwiązało mój problem:
Element menu z
showAsAction="always"
i w działalności
źródło
always
wartościshowAsAction
atrybutu rozwiązuje problem. Ważną rzeczą jest to, że gdyalways
wartość jestis not
obecna wshowAsAction
, rozwiniętySearchView
przedstawia przycisk zamykania (ikona krzyżyka) tylko wtedy, gdy zapytanie wSearchView
nie jest ciągiem niezerowym.SearchView.onCloseClicked
Że uchwyty blisko WYDARZENIA przycisk mówi, że wywołania zwrotnegoOnCloseListener
nazywa się tylko wtedy, gdy kwerenda jest pusta, jeśli nie - to zdaje się pierwsza - ale potem, po bliskich zapytania rozliczeń przycisku znika i jesteśmy w stanie dostarczyćonClose
wywołania zwrotnegoOnCloseListener
Aby
OnCloseListener
działało, upewnij się, żeshowAsAction
jest ustawione naalways
w pozycji menu wyszukiwania.źródło
Napotkałem ten sam problem z onCloseListener nie wywołującym SearchView. Zrozum z problemu błędu zgłoszonego w 25758 i niektórych postów, które przeczytałem, aby wywołać onCloseListener, musisz ustawić:
Ale w moim przypadku chciałem, aby widok wyszukiwania był otwarty i nie był wyświetlany przez cały czas. Udaje mi się to rozwiązać, dodając jeszcze jedną linię poniżej:
SearchView.setIconified (false) spowoduje otwarcie searchView, pomimo ustawienia wartości domyślnej iconified na true w poprzednim wierszu. W ten sposób udało mi się mieć zarówno SearchView, który otwiera się cały czas, jak i wywoływał onCloseListener.
źródło
Utwórz pozycję menu z
app:showAsAction
ustawieniem na zawsze.Tworząc
SearchView
wonCreateOptionsMenu
metodzie zrób coś podobnegoNależy
search.setIconifiedByDefault(true)
ustawić, abytrue
wywołaćonClose()
metodę naSearchView.OnCloseListener()
utworzonym powyżej.źródło
W przypadku
MenuItemCompat
problemu dodałem ViewTreeObserver do śledzenia stanu widoczności. Możesz sprawdzić moją odpowiedź tutaj: https://stackoverflow.com/a/28762632/1633609źródło
Powodem, dla którego
OnCloseListener
nie jest wywoływany, jest błąd w kodzie Androida - słuchacz jest wywoływany tylko wtedy, gdy również dzwoniszsetIconifiedByDefault(true)
.źródło
wydaje się już stary wątek, ale myślałem, że mam ten sam problem z API 18 na początku. Po przeszukaniu go i znalezieniu tego wątku, kolejna godzina przeczytania wypróbowanego i błędnego javadoc dla czegoś, czego nie udaję w pełni rozumiem w javadoc, następująca praca dla mnie teraz:
Bawiłem się trochę z prawdą / fałszem, to w jakiś sposób robi różnicę i teraz działa. Miejmy nadzieję, że może to komuś zaoszczędzić czas.
źródło
To obejście, ale zadziałało dla mnie
źródło
jeśli klikniesz zamknij searchView ->
D / kliknięcie: zamknięcie kliknięto
źródło
Napotkałem ten problem, próbując wykryć wyświetlanie / odrzucanie SearchView. Skończyło się na tym, że użyłem innego słuchacza i działało to, czego potrzebowałem:
źródło
Użyłem przycisku zamykania SearchView i ustawiłem na nim setOnClickListener
źródło
W systemie Android nie ma konsoli do logowania. Zamiast tego użyj struktury rejestrowania systemu Android:
Zobacz także to pytanie: Dlaczego „System.out.println” nie działa w systemie Android?
źródło
Istnieją dwa typowe wzorce dla
SearchView.setOnCloseListener()
. To naprawdę dotyczy wszystkich słuchaczy, ale odnoszę się konkretnie do twojego pytania. Pierwszy sposób polega na utworzeniu funkcji nasłuchującej i dołączeniu jej do zmiennej składowej, a drugi polega na tym, aby klasa implementowała interfejs i by funkcja obsługi była funkcją składową.Tworzenie obiektu detektora wygląda następująco:
Implementacja detektora na poziomie klasy wygląda następująco:
Nie widziałem żadnych przykładów, które tworzyłyby
OnCloseListener
ad hoc, jak to zrobiłeś w swoim pytaniu.źródło