Search View использует значок приложения вместо логотипа

В документах на Android объясняется, что логотип приложения используется везде, когда он определен. Но когда расширение поиска расширяется, значок приложения используется вместо логотипа приложения, и я не могу найти способ показать логотип приложения, когда поиск открывается в расширенном состоянии.

Вот соответствующие части.

Файл манифеста

<application android:name="MyApp" android:allowBackup="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:logo="@drawable/app_logo" android:theme="@style/Theme.MyTheme" > 

Searchable.xml (значок настройки ничего не меняет)

 <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:icon="@drawable/app_logo" android:label="@string/app_name" android:hint="@string/search_hint" > </searchable> 

menu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_search" android:actionViewClass="com.actionbarsherlock.widget.SearchView" android:icon="@drawable/ic_search" android:showAsAction="always|collapseActionView" /> 

Код активности

 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); menu.findItem(R.id.menu_search).setActionView(searchView); 

ПРИМЕЧАНИЕ. Я использую ABS SearchView, но то же самое происходит, когда я переключаюсь по умолчанию SearchView.

EDIT: я добавил несколько скриншотов для ясности.

Здесь я использовал изображение звезды для логотипа приложения и изображение Android для значка приложения. Первый снимок экрана – это представление активности по умолчанию. Второй – это вид, когда я нажимаю кнопку поиска. Он показывает изображение андроида, в то время как я ожидаю, что это будет изображение звезды.

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

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

Установите логотип в качестве значка. Через атрибут темы

 <item name="android:icon">@drawable/ab_logo</item> 

Или в коде

 getSupportActionBar().setIcon(R.drawable.ab_logo); 

Вы используете совершенно другой SearchView, который вы указали в menu.xml.

С помощью этого кода вы создаете новый SearchView, который не является тем, что вы хотите.

 SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); 

Поэтому попробуйте создать такое меню.

 this.getSupportMenuInflater().inflate(R.menu.menu, menu); final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); final MenuItem searchItem = menu.findItem(R.id.menu_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setSearchableInfo(info); 

А для ActionBar вместо setDisplayUseLogoEnabled (true) и других, попробуйте установить все параметры сразу

 final ActionBar bar = getSupportActionBar(); bar.setDisplayOptions( ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP); 

Это настройка, которая у меня есть в моем текущем проекте и никогда не возникала таких проблем.

У меня была та же проблема, и я решил это, используя следующий код:

 menu.findItem(R.id.menu_search).setOnActionExpandListener(this); // Your Activity/Fragment must implement the MenuItem.OnActionExpandListener interface @Override public boolean onMenuItemActionExpand(MenuItem item) { getSherlockActivity().getSupportActionBar().setIcon(R.drawable.uvweb_logo); return true; } 

Дайте мне знать, как это работает для вас.

Я достиг решения с помощью этой простой логики:

 public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.menu_search: getActionBar().setIcon(R.drawable.your_logo); return true; } return super.onOptionsItemSelected(item); } 

Просто удалите collapseActionView из вашего меню Xml.

Чтобы заменить значок логотипом, укажите свой логотип приложения в файле манифеста с атрибутом android:logo , затем вызовите setDisplayUseLogoEnabled(true) в своей деятельности.

Ссылаться на этот документ1 документ2

И, пожалуйста, см. Этот ответ для получения дополнительной информации

Единственное, что вам нужно установить – это (в onCreate of activity):

 getSupportActionBar().setIcon(R.drawable.logo); 

… нет также setLogo.

Независимо от того, есть ли значок в манифесте, установленный на что-то другое, это покажет активности для использования другого изображения во время выполнения.

Я проверил это со следующим пунктом меню, и он работает:

  <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_search" android:icon="@drawable/ic_action_search" android:title="@string/search_hint" android:orderInCategory="1" android:actionViewClass="android.widget.SearchView" android:showAsAction="always|collapseActionView"/> </menu> 

Надувается, как обычно, в onCreateOptionsMenu:

 getSupportMenuInflater().inflate(R.menu.search_menu, menu); 

У меня была та же проблема, (для АБС) у меня было:

  ActionBar actionBar = ((SherlockFragmentActivity) activity).getSupportActionBar(); actionBar.setLogo(R.drawable.logo); 

И я просто добавил:

 actionBar.setIcon(R.drawable.logo); 

И проблема исчезла.

Я нашел, что лучший способ решить эту проблему состоял в том, чтобы добавить SearchView программно в меню следующим образом:

  SearchView searchView = new SearchView(getActionBar().getThemedContext()); menu.add("Search") .setIcon(R.drawable.ic_action_search) .setActionView(searchView) .setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { getActionBar().setIcon(R.drawable.ic_action_willyweather); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { return true; } }) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); 

И затем используйте onActionExpandListener, чтобы изменить значок / логотип на правильное значение, когда затем будет развернут SearchView.

Это решение может также работать, если вы определяете SearchView в menu.xml, но вам все равно нужно настроить код onActionExpandListener (), чтобы сделать то же, что и в приведенном выше примере.

Энди.