Android searchview setOnActionExpandListener on Honeycomb 3.2

Я разрабатываю приложение для Android 3.2 и выше с android-support-v4 . Мне нужно реализовать OnActionExpandListener для «перехвата», когда SearchView в панели действий расширяется и когда свертывается. Мой код для Android 4.0 и выше это нормально, но для 3.2 нет.

menu.xml

 <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="collapseActionView|always" android:actionViewClass="android.widget.SearchView" /> 

MyActivity.java

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.reader, menu); final MenuItem searchMI = menu.findItem(R.id.menu_search); if(searchView == null) { //searchView = (SearchView) searchMI.getActionView(); searchView = (SearchView) MenuItemCompat.getActionView(searchMI); searchView.setOnQueryTextListener(this); searchView.setOnSuggestionListener(this); searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { //some code return false; } }); } int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) { MenuItemCompat.setShowAsAction(searchMI, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); MenuItemCompat.setOnActionExpandListener(searchMI, new OnActionExpandListener() { /* (non-Javadoc) * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem) */ @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } /* (non-Javadoc) * @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem) */ @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } }); } else { searchMI.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { Toast.makeText(getApplicationContext(), "MenuItem#onMenuItemActionExpand", Toast.LENGTH_SHORT).show(); return true; } }); } } 

Почему, для Honeycomb, методы прослушивателя не вызываются?

Огромное спасибо.

Solutions Collecting From Web of "Android searchview setOnActionExpandListener on Honeycomb 3.2"

Вероятно, вы пропустили факт (как и я), что интерфейс `MenuItemCompat.OnActionExpandListener 'имеет статическую реализацию и не является методом экземпляра.

Итак, если у вас есть класс, который реализует MenuItemCompat.OnActionExpandListener тогда в этом классе вам необходимо установить его в качестве слушателя следующим образом:

  MenuItem menuItem = menu.findItem(R.id.search); if (menuItem != null) { MenuItemCompat.setOnActionExpandListener(menuItem,this); MenuItemCompat.setActionView(menuItem, mSearchView); } 

Эта же парадигма применяется к setActionView … вместо вызова menuItem.setActionView(this) , вы передаете элемент menuItem в качестве первого аргумента в статическую версию MenuItemCompat.setActionView и следуете с другими аргументами.

Для работы MenuItemCompat.setOnActionExpandListener вы должны добавить « collapseActionView », добавленный в пункт меню, например,

 <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" /> 

И в onCreateOptionsMenu вы можете использовать его таким образом –

 MenuItemCompat.setOnActionExpandListener(menu_search, new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when collapsed return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when expanded return true; // Return true to expand action view } }); 

Я обнаружил, что MenuItemCompat.setOnActionExpandListener(...) не работает, если вы не проходите:

  searchItem .setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_ALWAYS); 

Но это меняет SearchView и заменяет DrawerToggle на стрелку назад.

Я хотел сохранить исходные представления и отслеживать состояние Expanded / Collapsed и использовать поддерживаемый Search View.

Решение:

Когда android.support.v7.widget.SearchView меняет состояние представления в представлении LinearLayout с идентификатором android.support.v7.appcompat.R.id.search_edit_frame , значение видимости изменяется с View.VISIBLE на View.GONE и наоборот , Поэтому я добавляю ViewTreeObserver для отслеживания изменения видимости рамки редактирования поиска.

menu_search.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> </menu> 

В деятельности:

 import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuItem; .......... private View mSearchEditFrame; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search, menu); MenuItem searchItem = (MenuItem) menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat .getActionView(searchItem); searchView.setSubmitButtonEnabled(false); mSearchEditFrame = searchView .findViewById(android.support.v7.appcompat.R.id.search_edit_frame); ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { int oldVisibility = -1; @Override public void onGlobalLayout() { int currentVisibility = mSearchEditFrame.getVisibility(); if (currentVisibility != oldVisibility) { if (currentVisibility == View.VISIBLE) { Log.v(TAG, "EXPANDED"); } else { Log.v(TAG, "COLLAPSED"); } oldVisibility = currentVisibility; } } }); return super.onCreateOptionsMenu(menu); } 

Благодаря!

Вашим слушателем должен быть MenuItemCompat.OnActionExpandListener ().

 MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { } 

Спасибо за вашу помощь, ваше решение работает для меня. И я хотел бы проголосовать за вас, но я просто понял, что у меня только 1 репутация, (; '⌒`)

На самом деле, мое решение похоже на ваше, в XML-файле меню есть только одно:

  <item android:id="@+id/apps_menu_search" android:icon="@drawable/ic_action_search" android:title="@string/apps_menu_search" android:visible="true" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" />