Czy ktoś zna samouczek lub przykład, jak zaimplementować standardowy interfejs wyszukiwania Androida za pomocą Fragment
s? Innymi słowy, czy można przeprowadzić standardowe wyszukiwanie z a SearchManager
we fragmencie?
java
android
sqlite
android-fragments
android-searchmanager
Czarny pas
źródło
źródło
Odpowiedzi:
Krótko mówiąc, nie możesz. Istnieje kilka powodów, dla których utworzenie interfejsu wyszukiwania w ramach a
Fragment
nie jest możliwe.Tworząc interfejs z możliwością wyszukiwania, w manifeście systemu Android należy określić domyślne „działanie z możliwością wyszukiwania”. Jak na pewno wiesz,
Fragment
nie może istnieć bez rodzica,Activity
a zatem ta separacja nie jest możliwa.Jeśli już wymyśliłeś numer 1, zakładam, że zadałeś to pytanie w nadziei, że istnieje jakiś magiczny „hack”, który może wykonać zadanie. Jednak dokumentacja stwierdza, że
Podstawowy, wewnętrzny system odpowiedzialny za dostarczanie wyników wyszukiwania oczekuje
Activity
, a nieFragment
; w związku z tym wdrożenie interfejsu wyszukiwania, który jest całkowicie niezależny od systemu,Activity
nie jest możliwe, ponieważ wymagałoby zmian w samym systemie bazowym . Sprawdź kod źródłowySearchableInfo
zajęć, jeśli mi nie wierzysz :).Biorąc to pod uwagę, nie wydaje się, że osiągnięcie czegoś podobnego do tego, co opisujesz, nie byłoby zbyt trudne. Na przykład możesz rozważyć zaimplementowanie swojego działania, które można przeszukiwać, tak aby zaakceptowało
android.intent.action.SEARCH
zamiar i (zamiast na przykład natychmiast wyświetlać wyniki w aListView
) przekaże zapytanie wyszukiwania do twojegoFragment
s. Na przykład rozważ następujące działanie z możliwością wyszukiwania:Po wysłaniu żądania wyszukiwania system uruchomi Twoją możliwą do przeszukiwania aktywność, wykona zapytanie i przekaże wyniki do pewnego kontenera Działania (na podstawie Twojej implementacji
doMySearch
). Działanie kontenera przekaże następnie te wyniki do zawartego przeszukiwaniaFragment
, w którym zostaną wyświetlone wyniki. Wdrożenie wymaga trochę więcej pracy niż to, na co prawdopodobnie liczyłeś, ale jestem pewien, że istnieją sposoby na uczynienie jej bardziej modułową i wydaje się, że może to być najlepsze, co możesz zrobić.ps Jeśli używasz tego podejścia, być może będziesz musiał zwrócić szczególną uwagę na to, które Aktywności są dodawane / usuwane z zaplecza. Zobacz ten post, aby uzyskać więcej informacji o tym, jak można to zrobić.
pps Możesz także całkowicie zapomnieć o standardowym interfejsie wyszukiwania i po prostu zaimplementować proste wyszukiwanie w ramach,
Fragment
jak opisano w poście Raghava poniżej .źródło
SearchManager
forFragment
s, prawda? (lub coś w tym stylu)Oto przykład wyszukiwania czegoś za pomocą fragmentów. Mam nadzieję, że to pomoże i właśnie tego szukasz:
źródło
Fragment
więc nie narzekałbym. Gratulacje! : PonQueryTextChange
metoda nie jest wywoływana.Wyszukiwanie w fragmencie jest całkiem możliwe przy użyciu standardowego interfejsu API ActionBar SearchView ActionView. Będzie to działać również z powrotem do systemu Android 2.1 (poziom interfejsu API 7) przy użyciu klas obsługi AppCompat v7.
W twoim fragmencie:
W swoim menu XML
źródło
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
Korzystanie z klas obsługi AppCompat v7. Wystarczy dodać coś do @David roztworu „s od @Rookie rozwiązanie, aby uzyskać to działa prawidłowo w prosty sposób, oto mój fragment kodu:
MyFragment :
Dodałem
onActivityCreated
, bo bez wywołaniasetHasOptionsMenu(true);
systemu nie będzie wiedział, że ten fragment musi wejść w interakcję z menu.następnie usunąłem linię,
inflater.inflate(R.menu.main, menu);
ponieważ podwoiła pozycje menu, ponieważ Aktywność zawyżała menu, a następnie Fragment zawęziło inne menuDzięki @David i @Rookie
źródło
Podczas pracy
Fragments
nadal musisz używaćActivity
do kontrolowania i przypisywania plikówFragments
. MożeActivity
to mieć funkcjonalność wyszukiwania, jak poprzednio.Niedawno przerzuciłem się z „normalnej”
Activity
aplikacji naFragment
aplikację opartą na aplikacji i funkcja wyszukiwania działała u mnie tak samo.Czy próbowałeś nad tym pracować i nie udało się? Jeśli tak, podaj więcej szczegółów w swoim pytaniu.
EDYTOWAĆ:
Jeśli chcesz mieć wyszukać konkretny fragment, mieć wszystkie swoje
Fragments
rozszerzyć interfejsMyFragment
zstartSearch
metodą i mają swojeActivity
„sstartSearch
wywołanie metody bieżącego fragmentu jeststartSearch
metoda.źródło
Myślę, że udało mi się to osiągnąć: faktycznie można użyć fragmentów i dodać ikonę wyszukiwania do paska akcji, aby wyszukiwanie było możliwe wewnątrz fragmentów. Sztuczka polega na użyciu paska akcji, widoku akcji, nasłuchiwania, programu ładującego i oczywiście adaptera.
Działa to całkiem nieźle, chociaż całkowicie omija mechanizm wyszukiwania platformy androida (ale można go uzupełnić trochę pracy, aby znaleźć to, co opisuje @Alex Lockwood i przekazać wyszukiwanie do fragmentów). Nie zareagowałoby na intencję zgodnie z oczekiwaniami w przypadku działania, ale działa: użytkownicy mogą przeszukiwać fragmenty.
Oto kod:
Plik xml z menu fragmentów wyszukiwania res / menu / menu_search.xml:
Oraz plik układu xml res / layout / search_in_fragments.xml
źródło
SearchView
biblioteki ActionBarSherlock ze względu na jej złożoność ( zobacz jego komentarz tutaj ). Jak widać (i jak opisałem również w mojej odpowiedzi), implementacja wyszukiwania w Androidzie nie jest trywialna ... jest zakorzeniona w podstawowym systemie, co sprawia, że nawet biblioteki innych firm są trudne do napisania (i to coś mówi. .. Jake Wharton jest jak Chuck Norris z bibliotek zewnętrznych!: D).SearchView.java
kod źródłowy tutaj.Użyj
ActionBar
iSearchView
. Będziesz mógł obsługiwać wyszukiwania bez połączenia z działaniem. Wystarczy ustawićOnQueryTextListener
na SearchView.Więcej informacji na temat wyszukiwania niestandardowego można znaleźć w tym poście.
źródło
inne rozwiązania ..... nie podoba mi się to. To dla mnie łatwiejsze, ale to mój pomysł, czekam na twoją opinię
źródło
A
Fragment
nie może istnieć pozaActivity
ani ani nie możeFragment
być połączone zandroid.intent.action.SEARCH
żadnym innymintent-filter
.Więc bez użycia znaku
Activity
do owinięciaFragment
, to, o co prosisz, nie jest możliwe.źródło
W przypadku fragmentów do ViewPager mógłbym to zrobić blokując przycisk wyszukiwania, gdy nie jestem na fragmencie, w którym chcę nadać pasek wyszukiwania. Do działania:
A w przypadku braku fizycznego przycisku wyszukiwania, dodałem do fragmentu element akcji, który wyzwala ten kod:
źródło
znalazłem obejście :) możesz zastąpić tę metodę (startActivity (Intent)) w swojej BaseActivity, a następnie sprawdzić, czy akcja to ACTION_SEARCH, a następnie wykonaj swoją specjalną pracę: D
źródło
tak, to możliwe,
proszę zaimplementować widok wyszukiwania na swojej aktywności, 'onQueryTextChange' w Activity również nasłuchuje wyszukiwania we fragmencie, możesz sprawdzić widoczność fragmentu w 'onQueryTextChange', jeśli jest widoczny, możesz wywołać swoją metodę wyszukiwania dla fragmentu, działa idealnie w moim kodzie
źródło