Кто-нибудь знает учебник или пример того, как реализовать стандартный интерфейс поиска Android с Fragment
s? Другими словами, возможно ли поместить стандартный поиск с SearchManager
фрагментом во фрагмент?
java
android
sqlite
android-fragments
android-searchmanager
Черный пояс
источник
источник
Ответы:
Короче говоря, вы не можете. Есть несколько причин, по которым создание поискового интерфейса внутри
Fragment
невозможно.При создании интерфейса с возможностью поиска в манифесте Android необходимо указать «активность с возможностью поиска» по умолчанию. Как я уверен, вы знаете, что
Fragment
не может существовать без родителяActivity
и, следовательно, это разделение невозможно.Если вы уже поняли # 1, я полагаю, что вы задавали этот вопрос в надежде, что есть какой-то волшебный "хак", который может выполнить работу. Однако в документации говорится, что
Базовая внутренняя система, которая отвечает за предоставление результатов поиска, ожидает
Activity
, а неFragment
; таким образом, реализация интерфейса поиска, который полностью независим от интерфейса,Activity
невозможен, так как это потребует изменений в самой базовой системе . Проверьте исходный код дляSearchableInfo
класса, если вы мне не верите :).При этом не кажется, что было бы слишком сложно достичь чего-то похожего на то, что вы описываете. Например, вы можете подумать о реализации вашей функции поиска с возможностью активности, чтобы она принимала
android.intent.action.SEARCH
намерение и (вместо немедленного отображения результатов вListView
, например) передавала поисковый запрос вашим сотрудникамFragment
. Например, рассмотрим следующую активность с возможностью поиска:Когда будет выполнен поисковый запрос, система запустит вашу поисковую активность, выполнит запрос и передаст результаты некоторому контейнеру Activity (в зависимости от вашей реализации
doMySearch
). Затем контейнер Activity передаст эти результаты в содержащийся для поискаFragment
, в котором результаты будут отображены. Реализация требует немного больше работы, чем вы, вероятно, надеялись, но я уверен, что есть способы сделать ее более модульной, и кажется, что это может быть лучшим, что вы можете сделать.ps Если вы используете этот подход, вам, возможно, придется обратить особое внимание на то, какие действия добавляются / удаляются в backstack. Посмотри это пост для получения дополнительной информации о том, как это можно сделать.
pps Вы также можете полностью забыть о стандартном интерфейсе поиска и просто реализовать простой поиск внутри,
Fragment
как описано в посте Рагхава ниже .источник
SearchManager
дляFragment
права? (или что-то в этом роде)Вот пример для поиска чего-либо с использованием фрагментов. Надеюсь, это поможет, и это то, что вы ищете:
источник
Fragment
поэтому я бы не стал жаловаться. Congrats! : PonQueryTextChange
метод не вызывается.Поиск фрагмента вполне возможен с использованием стандартного API ActionBar SearchView ActionView. Это будет работать и в Android 2.1 (уровень API 7) с использованием классов поддержки AppCompat v7.
В вашем фрагменте:
В вашем меню XML
источник
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
Использование классов поддержки AppCompat v7. Просто добавить что - то к @David решения «s от @Rookie раствора , чтобы получить его работать должным образом в простой форме, вот мой фрагмент кода:
MyFragment :
Я добавил
onActivityCreated
, Потому что без звонкаsetHasOptionsMenu(true);
системы не будет знать, что этот фрагмент должен взаимодействовать с меню.тогда я убрал строку
inflater.inflate(R.menu.main, menu);
потому что она удваивала пункты меню, так как Activity раздувала меню, затем Fragment раздувал другое менюБлагодаря @David и @Rookie
источник
При работе с
Fragments
вами по-прежнему необходимо использоватьActivity
для управления и назначенияFragments
. ЭтоActivity
может иметь функции поиска, как и раньше.Я недавно переключился с «нормального»
Activity
приложения на приложение наFragment
основе, и функции поиска работали для меня точно так же.Вы пытались работать над этим, и не удалось? Если это так, дайте более подробную информацию в вашем вопросе.
РЕДАКТИРОВАТЬ:
Если вы хотите , чтобы поиск фрагмента конкретного, все ваши
Fragments
расширения интерфейсаMyFragment
сstartSearch
методом, и вашActivity
«sstartSearch
вызов метода текущего фрагментомstartSearch
метод.источник
Я думаю, что я достиг этого: вы можете использовать фрагменты и добавить значок поиска на панель действий, чтобы поиск был возможен внутри фрагментов. Хитрость заключается в том, чтобы использовать панель действий, представление действий, слушателя для него, загрузчик и адаптер, конечно.
Это работает довольно хорошо, хотя полностью обходит механизм поиска платформы Android (но его можно было бы завершить некоторой работой, чтобы найти то, что описывает @Alex Lockwood, и передать поиск по фрагментам). Он не будет реагировать на намерение, как ожидается в случае действия, но он работает: пользователи могут искать внутри фрагментов.
Вот код:
Файл xml для меню поисковых фрагментов res / menu / menu_search.xml:
И XML-файл макета res / layout / search_in_fragments.xml
источник
SearchView
для своей библиотеки ActionBarSherlock из-за ее сложности ( см. Его комментарий здесь ). Как вы можете видеть (и, как я уже описал в своем ответе), поисковая реализация Android совсем не тривиальна ... она укоренилась в базовой системе, и это затрудняет написание даже сторонних библиотек (и это говорит о чем-то. .. Джейк Уортон похож на Чака Норриса из сторонних библиотек!: D).SearchView.java
исходный код здесь.Используйте
ActionBar
иSearchView
. Вы сможете обрабатывать поиски без какой-либо связи с деятельностью. Просто установитеOnQueryTextListener
для SearchView.Смотрите этот пост для более подробной информации о пользовательском поиске.
источник
другие решения ..... мне не нравится это. Это легче для меня. Но это моя идея. Жду твоего мнения
источник
A
Fragment
не может существовать вне иActivity
не можетFragment
быть связано с aandroid.intent.action.SEARCH
или любым другимintent-filter
.Таким образом, без использования,
Activity
чтобы обернутьFragment
, то, что вы спрашиваете, невозможно.источник
В случае фрагментов в ViewPager, я мог бы сделать это, заблокировав кнопку поиска, когда я не на фрагменте, где я хочу дать панель поиска. В деятельность:
И в случае отсутствия кнопки физического поиска, я добавил элемент действия во фрагмент, который вызывает этот код:
источник
я нашел обходной путь :) вы можете переопределить этот метод (startActivity (Intent)) в вашем BaseActivity, а затем проверить, является ли действие ACTION_SEARCH, а затем выполнить свою специальную работу: D
источник
да, это возможно,
пожалуйста, реализуйте представление поиска по вашей активности, onQueryTextChange в Activity также будет прослушивать поиск по фрагменту, вы можете проверить видимость фрагмента в 'onQueryTextChange', если он виден, вы можете вызвать метод поиска для фрагмента, его работа отлично работает в моем коде
источник