Action Bar Шерлок SearchView не расширяется по щелчку

У меня есть одна активность фрагмента Шерлока, из которой я устанавливаю различные фрагменты sherlock с помощью адаптера фрагмента пейджера.

Теперь, чтобы показать searchview в каждом фрагменте, я разместил этот метод в onCreate of Fragment ::

Этот метод отобразит пункты меню в ActionBar фрагмента.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

Я также установил onCreateOptionMenu () следующим образом:

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu, menu); final MenuItem searchItem = menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint("Search Here"); } 

Теперь странные вещи случаются так, что в моем первом фрагменте я сделал то же самое, и поиск открывается успешно.

Если

  • Я перехожу к первому фрагменту, откройте поисковый запрос, затем перейдите ко второму
  • Фрагмент поиска будет открыт.

То же самое происходит и для третьего фрагмента

  • Перейти к 3-му фрагменту,
  • Open searchview,
  • Назад ко второму отрезку, поиск открывается.

Но если я перейду непосредственно к второму фрагменту, поиск не откроется.

Надеюсь, я понятна.

Есть ли какие-нибудь подсказки об этом? Любые предложения / ссылки будут оценены.

Заранее спасибо…

РЕДАКТИРОВАТЬ ::

menu.xml

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_search" android:icon="@drawable/abs__ic_search" android:showAsAction="ifRoom|collapseActionView" android:actionViewClass="com.actionbarsherlock.widget.SearchView" android:title="Search Products"> </item> <item android:id="@+id/root_menu" android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light" android:showAsAction="always" android:title="More"> <menu> <item android:id="@+id/menu_Home" android:icon="@drawable/home" android:showAsAction="never" android:title="Home"/> <item android:id="@+id/menu_favourite" android:icon="@drawable/favourite" android:showAsAction="never" android:title="Favourite"/> <item android:id="@+id/menu_Balance" android:icon="@drawable/balance" android:showAsAction="never" android:title="Balance"/> <item android:id="@+id/menu_logout" android:icon="@drawable/btn_logout" android:showAsAction="never" android:title="Logout"/> </menu> </item> </menu> 

Logcat ::

  12-06 16:45:26.401: E/AndroidRuntime(1581): FATAL EXCEPTION: main 12-06 16:45:26.401: E/AndroidRuntime(1581): java.lang.ClassCastException: com.mobifin.subscriber.ButtonPayActivity 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.mobifin.subscriber.home.BillPayFragment.onCreateOptionsMenu(BillPayFragment.java:101) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:55) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:560) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:466) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:265) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.app.SherlockFragmentActivity.invalidateOptionsMenu(SherlockFragmentActivity.java:149) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.actionbarsherlock.app.SherlockFragmentActivity.supportInvalidateOptionsMenu(SherlockFragmentActivity.java:155) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.Fragment.setMenuVisibility(Fragment.java:726) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:127) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.populate(ViewPager.java:802) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1280) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1176) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1562) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.View.draw(View.java:6883) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.View.draw(View.java:6883) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.widget.FrameLayout.draw(FrameLayout.java:357) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.draw(ViewRoot.java:1522) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.performTraversals(ViewRoot.java:1258) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.os.Handler.dispatchMessage(Handler.java:99) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.os.Looper.loop(Looper.java:130) 12-06 16:45:26.401: E/AndroidRuntime(1581): at android.app.ActivityThread.main(ActivityThread.java:3683) 12-06 16:45:26.401: E/AndroidRuntime(1581): at java.lang.reflect.Method.invokeNative(Native Method) 12-06 16:45:26.401: E/AndroidRuntime(1581): at java.lang.reflect.Method.invoke(Method.java:507) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 12-06 16:45:26.401: E/AndroidRuntime(1581): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 12-06 16:45:26.401: E/AndroidRuntime(1581): at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "Action Bar Шерлок SearchView не расширяется по щелчку"

Обычно мы используем onCreateOptionsMenu() для создания меню опций для фрагментов и действий. Если вы просмотрите документацию, есть еще один вспомогательный метод, называемый onPrepareOptionsMenu() который, согласно документации, гласит:

Подготовьте меню стандартных параметров экрана, которое будет отображаться. Это вызывается прямо перед отображением меню при каждом его показе. Вы можете использовать этот метод для эффективного включения / отключения элементов или, в противном случае, для динамического изменения содержимого.

Расширение / SearchView прекрасно работает, когда мы не ViewPager фрагменты внутри ViewPager или что-либо подобное, например, сценарии переключения. Однажды у меня была одна проблема. Я onPrepareOptionsMenu() использовать onPrepareOptionsMenu() для решения моей проблемы.

Просто реализуйте onPrepareOptionsMenu() в каждом из ваших фрагментов и внутри него, вызывайте onQueryTextChange("") передавая "" качестве строки запроса. Он будет делать трюк, чтобы предложить активность контейнера фрагментов, что этот фрагмент хочет иметь в виду его собственный поисковый бизнес.

ИЛИ, Не уверен, но вызов invalidateOptionsMenu() на активность контейнера также может оказаться полезным.

Дайте мне знать, если это поможет.

РЕДАКТИРОВАТЬ:

Моя реализация:

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); SearchView searchView = new SearchView(getActivity()); searchView.setQueryHint("Search for Events"); searchView.setOnQueryTextListener(this); menu.add(0, ACTION_SEARCH, 0, "Search") .setIcon(R.drawable.ic_mailbox_search) .setActionView(searchView) .setOnActionExpandListener(menuExpandListener) .setShowAsAction( MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); onQueryTextChange(""); } @Override public boolean onQueryTextSubmit(String query) { return true; } @Override public boolean onQueryTextChange(String newText) { if (mAdapter != null) mAdapter.getFilter().filter(newText); return false; } 

Я достиг того, чего хочу, но с одной проблемой. Я не знаю, что я сделал, это хак / патч или правильный способ, но он отлично работает в <3.0, но теперь найдите проблему в> = 3.0.

Что я сделал:

В My Container Activity я объявляю onCreateOptionsMenu () и onPrepareOptionsMenu () ::

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getSupportMenuInflater().inflate(R.menu.menu, menu); return true; } public boolean onPrepareOptionsMenu(Menu menu) { if(versionStatus==0) { menu.findItem(R.id.root_menu).setVisible(false); } return super.onPrepareOptionsMenu(menu); } 

Теперь в каждом фрагменте onCreateOptionsMenu () я сделал что-то вроде этого ::
Я проверил версию сборки ОС и на основе этого я manupulate мое меню, как показано ниже ..

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); int currentapiVersion = android.os.Build.VERSION.SDK_INT; int versionStatus = 0; if (currentapiVersion == android.os.Build.VERSION_CODES.FROYO || currentapiVersion == android.os.Build.VERSION_CODES.GINGERBREAD) { versionStatus=0; } else if(currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { versionStatus=1; } if(versionStatus==1) { inflater.inflate(R.menu.menu, menu); menu.findItem(R.id.menu_item_search).setVisible(false); final MenuItem searchItem = menu.findItem(R.id.menu_item_search); SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint("Search Products"); searchView.setIconifiedByDefault(false); searchView.setOnQueryTextListener(this); } else { inflater.inflate(R.menu.menu, menu); final MenuItem searchItem = menu.findItem(R.id.menu_item_search); SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint("Search Products"); searchView.setIconifiedByDefault(false); searchView.setOnQueryTextListener(this); } } 

Он отлично работает в 2.3.3, но проблема m, стоящая сейчас, находится в 3.0 +

1) не удалось увидеть подсказку после расширения поиска
2) разверните поиск в первом фрагменте … Введите описание изображения здесь

3) Переход ко второму фрагменту (без сглаживания поискового запроса) Введите описание изображения здесь

4) Теперь во втором фрагменте разверните поиск текущего фрагмента Введите описание изображения здесь

5) в текущем фрагменте нажата. Тогда результат беспорядок 🙁

Введите описание изображения здесь

РЕДАКТИРОВАТЬ ::

Я сделал следующие изменения в моей Контейнерной деятельности, и теперь это работает отлично, Наконец я достиг того, что хочу ….

  @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); if(versionStatus==0) { getSupportMenuInflater().inflate(R.menu.menu, menu); } return true; } public boolean onPrepareOptionsMenu(Menu menu) { if(versionStatus==0) { menu.findItem(R.id.root_menu).setVisible(false); } return super.onPrepareOptionsMenu(menu); }