Kennt jemand ein Tutorial oder ein Beispiel für die Implementierung der Standard- Android-Suchoberfläche mit Fragment
s? Mit anderen Worten, ist es möglich, eine Standardsuche mit a SearchManager
in ein Fragment einzufügen?
java
android
sqlite
android-fragments
android-searchmanager
Schwarzer Gürtel
quelle
quelle
Antworten:
Kurz gesagt, Sie können nicht. Es gibt mehrere Gründe, warum das Erstellen einer Suchoberfläche innerhalb von a
Fragment
nicht möglich ist.Wenn Sie eine durchsuchbare Oberfläche erstellen, müssen Sie in Ihrem Android-Manifest eine standardmäßige "durchsuchbare Aktivität" angeben. Wie Sie sicher wissen,
Fragment
kann a ohne einen Elternteil nicht existierenActivity
und daher ist diese Trennung nicht möglich.Wenn Sie bereits die Nummer 1 herausgefunden haben, haben Sie diese Frage vermutlich in der Hoffnung gestellt, dass es da draußen einen magischen "Hack" gibt, der die Arbeit erledigen kann. In der Dokumentation heißt es jedoch:
Das zugrunde liegende interne System, das für die Bereitstellung der Suchergebnisse verantwortlich ist, erwartet ein
Activity
, keinFragment
; Daher ist die Implementierung einer Suchschnittstelle, die völlig unabhängig von einerActivity
ist, nicht möglich, da Änderungen am zugrunde liegenden System selbst erforderlich wären . Überprüfen Sie den Quellcode für dieSearchableInfo
Klasse, wenn Sie mir nicht glauben :).Abgesehen davon scheint es nicht zu schwierig zu sein, etwas Ähnliches wie das zu erreichen, was Sie beschreiben. Sie könnten beispielsweise in Betracht ziehen, Ihre durchsuchbare Aktivität so zu implementieren, dass sie die
android.intent.action.SEARCH
Absicht akzeptiert und (anstattListView
beispielsweise die Ergebnisse sofort in a anzuzeigen ) die Suchabfrage an IhreFragment
s weiterleitet. Betrachten Sie beispielsweise die folgende durchsuchbare Aktivität:Wenn eine Suchanforderung gestellt wird, startet das System Ihre durchsuchbare Aktivität, führt die Abfrage durch und leitet die Ergebnisse an eine Containeraktivität weiter (basierend auf Ihrer Implementierung von
doMySearch
). Die Containeraktivität übergibt diese Ergebnisse dann an die enthaltene durchsuchbare DateiFragment
, in der die Ergebnisse angezeigt werden. Die Implementierung erfordert etwas mehr Arbeit als Sie wahrscheinlich erhofft hatten, aber ich bin sicher, dass es Möglichkeiten gibt, sie modularer zu gestalten, und es scheint, dass dies das Beste ist, was Sie tun können.ps Wenn Sie diesen Ansatz verwenden, müssen Sie möglicherweise besonders darauf achten, welche Aktivitäten zum Backstack hinzugefügt / daraus entfernt werden. In diesem Beitrag finden Sie weitere Informationen dazu.
pps Sie können auch die Standardsuchoberfläche vollständig vergessen und einfach eine einfache Suche in a implementieren,
Fragment
wie in Raghavs Beitrag unten beschrieben .quelle
SearchManager
fürFragment
s neu implementieren, oder? (oder so ähnlich)Hier ist das Beispiel, um etwas mit Fragmenten zu suchen. Hoffe es hilft und das ist was Sie suchen:
quelle
Fragment
so dass ich mich nicht beschweren würde. Glückwunsch! : PonQueryTextChange
Methode nicht aufgerufen.Es ist durchaus möglich, in einem Fragment mit der Standard-ActionBar SearchView ActionView-API zu suchen. Dies funktioniert auch mit Android 2.1 (API-Level 7) unter Verwendung der AppCompat-Unterstützungsklassen v7.
In Ihrem Fragment:
In Ihrem Menü XML
quelle
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
Verwenden von AppCompat-Unterstützungsklassen v7. Fügen Sie einfach etwas zu @Davids Lösung von @Rookie hinzu , damit es auf einfache Weise ordnungsgemäß funktioniert. Hier ist mein Fragmentcode:
MyFragment :
Ich fügte hinzu
onActivityCreated
, weil ohne anzurufensetHasOptionsMenu(true);
das System , nicht weiß, dass dieses Fragment mit dem Menü interagieren muss.dann habe ich die Leitung entfernt
inflater.inflate(R.menu.main, menu);
weil sie die Menüelemente verdoppelt hat, seit Aktivität ein Menü aufgeblasen hat, und Fragment ein anderes Menü aufgeblasen hatDanke an @David und @Rookie
quelle
Wenn
Fragments
Sie mit arbeiten, müssen Sie immer noch ein verwendenActivity
, um das zu steuern und zuzuweisenFragments
. DiesActivity
kann wie zuvor Suchfunktionen haben.Ich habe kürzlich von einer "normalen"
Activity
App zu einerFragment
basierten App gewechselt und die Suchfunktion hat bei mir genauso funktioniert.Haben Sie versucht, daran zu arbeiten, und es ist Ihnen nicht gelungen? Wenn ja, geben Sie in Ihrer Frage etwas mehr Details an.
BEARBEITEN:
Wenn Sie eine fragmentspezifische Suche durchführen möchten, lassen Sie alle
Fragments
eine SchnittstelleMyFragment
mit einerstartSearch
Methode erweitern und die Methode IhresActivity
's diestartSearch
Methode des aktuellen Fragments aufrufenstartSearch
.quelle
Ich glaube, ich habe es geschafft: Sie können tatsächlich Fragmente verwenden und einer Aktionsleiste ein Suchsymbol hinzufügen, damit eine Suche innerhalb der Fragmente möglich ist. Der Trick besteht darin, eine Aktionsleiste, eine Aktionsansicht, einen Listener, einen Loader und natürlich einen Adapter zu verwenden.
Dies funktioniert ziemlich gut, obwohl es den Suchmechanismus der Android-Plattform vollständig umgeht (aber es könnte mit einigen Arbeiten abgeschlossen werden, um herauszufinden, was @Alex Lockwood beschreibt, und die Suche an Fragmente weiterzuleiten). Es würde im Falle einer Aktivität nicht wie erwartet auf eine Absicht reagieren, aber es funktioniert: Benutzer können innerhalb von Fragmenten suchen.
Hier ist der Code:
Die XML-Datei für das Menü der Suchfragmente res / menu / menu_search.xml:
Und die XML-Layoutdatei res / layout / search_in_fragments.xml
quelle
SearchView
aufgrund seiner Komplexität beschlossen hat, die für seine ActionBarSherlock-Bibliothek nicht zu implementieren ( siehe seinen Kommentar hier ). Wie Sie sehen können (und wie ich auch in meiner Antwort beschrieben habe), ist die Suchimplementierung von Android alles andere als trivial ... sie ist im zugrunde liegenden System verankert, und dies erschwert das Schreiben selbst von Bibliotheken von Drittanbietern (und das sagt etwas aus. .. Jake Wharton ist wie der Chuck Norris von Bibliotheken von Drittanbietern !: D).SearchView.java
Quellcode an.Verwenden Sie das
ActionBar
undSearchView
. Sie können Suchvorgänge ohne Verbindung zu Aktivität ausführen.OnQueryTextListener
Stellen Sie einfach eine auf die Suchansicht.In diesem Beitrag finden Sie weitere Informationen zur benutzerdefinierten Suche.
quelle
andere Lösung ..... das gefällt mir nicht. Das ist einfacher für mich. Aber es ist meine Idee. Ich warte auf deine Meinung
quelle
A
Fragment
kann nicht außerhalb eines existiertActivity
, noch eine kannFragment
mit einem verbunden sein ,android.intent.action.SEARCH
oder jede andereintent-filter
.Ohne ein
Activity
zum Umwickeln des zu verwenden, ist dasFragment
, was Sie fragen, nicht möglich.quelle
Bei Fragmenten in einem ViewPager kann ich die Suchschaltfläche blockieren, wenn ich mich nicht in dem Fragment befinde, in dem ich eine Suchleiste angeben möchte. In die Aktivität:
Und falls keine physische Suchschaltfläche vorhanden ist, habe ich dem Fragment ein Aktionselement hinzugefügt, das diesen Code auslöst:
quelle
Ich habe eine Problemumgehung gefunden :) Sie können diese Methode (startActivity (Intent)) in Ihrer BaseActivity überschreiben und dann überprüfen, ob die Aktion ACTION_SEARCH ist, und dann Ihren speziellen Job ausführen: D.
quelle
Ja es ist möglich,
Bitte implementiert die Suchansicht für Ihre Aktivität. 'onQueryTextChange' in Aktivität überwacht auch die Suche in Fragmenten. Sie können die Fragmentsichtbarkeit in 'onQueryTextChange' überprüfen. Wenn sie sichtbar ist, können Sie Ihre Suchmethode für Fragment aufrufen. Sie funktioniert perfekt in meinem Code
quelle