SearchView принимает все пространство в новом ActionBarCompat
Я переключился с ActionBarSherlock на ActionBarCompat (поддержка библиотеки v7). После некоторых настроек почти все работает нормально.
Но у меня проблемы с SearchView в ActionBar. Когда он расширяется (на самом деле, он всегда расширяется в моей Activity), он занимает все пространство и не уважает пространство других элементов Action, которые должны отображаться всегда (showAsAction = "always" ).
Чтобы имитировать проблему, используйте это:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_buscar"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/abc_ic_search"
app:showAsAction="always"
android:title="@string/buscar"/>
<item android:id="@+id/tentar_novamente"
android:title="@string/tentar_novamente"
android:icon="@drawable/acao_tentar_novamente"
app:showAsAction="always" />
</menu>
В Управлении:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.busca_action_menu, menu);
searchMenuItem = menu.findItem(R.id.menu_buscar);
searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.setIconifiedByDefault(false);
searchView.setQueryHint(stringBusqueArtistasMusicasEAlbuns);
return super.onCreateOptionsMenu(menu);
}
Это результат в Android 4.3:
![enter image description here]()
И это результат в Android 2.3 (элементы действия даже не отображаются):
![enter image description here]()
Такая же проблема возникает, когда я использую:
setSupportProgressBarIndeterminateVisibility(true);
Индикатор прогресса выглядит очень странным в Android 4.3 и не отображается в Android 2.3.
Тот же код работал как ожидается с помощью ActionBarSherlock. Когда был какой-то элемент действия, SearchView использовал, чтобы уменьшить его ширину, чтобы дать место для элементов действия.
UPDATE:
Я опубликовал проблему в Android Bug Tracker:
https://code.google.com/p/android/issues/detail?id=58251&thanks=58251&ts=1375191632
Если у вас есть такая же проблема, пожалуйста, следуйте этой проблеме.
UPDATE:
Я попытался поместить элементы действия перед SearchView, и таким образом они появляются.
![enter image description here]()
Но setSupportProgressBarIndeterminateVisibility (true) по-прежнему не показывает индикатор выполнения.
Ответы
Ответ 1
Это определенно ошибка об Android, но обходной путь может включать SearchView программно следующим образом:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
searchView.setIconifiedByDefault(false);
getActionBar().setCustomView(searchView);
getActionBar().setDisplayShowCustomEnabled(true);
}
Вы также можете использовать XML-макет для определения свойств SearchView.
Однако "iconifiedByDefault" в XML имеет тенденцию быть неэффективным в моем опыте. (Это может быть мое плохое, хотя)
Спасибо за создание проблемы.
Вот URL-адрес соответствующего отчета об ошибке:
https://code.google.com/p/android/issues/detail?id=58251
Несмотря на то, что упоминается в отчете об ошибке, мой опыт был таким же как с ActionBarSherlock, так и с ActionBarCompat. Поэтому я ожидаю, что пользователи ActionBarSherlock также пострадают.
Ответ 2
Пробовали ли вы использовать collapseActionView()
?
Я использую его следующим образом:
public static MenuItem msearchMenuItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
msearchMenuItem = menu.findItem(R.id.search);
return true;
}
public static MenuItem getSearchMenuItem() {
return msearchMenuItem;
}
public void doSomething(){
//Collapse the SearchBar
getSearchMenuItem().collapseActionView();
}
Я не знаю, работает ли он с v7, но он, безусловно, работает с v4.
Попробуйте изменить андроид: showAsAction = "collapseActionView | ifRoom"
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:title="@string/search_title"
android:icon="@drawable/ic_search"
android:showAsAction="collapseActionView|ifRoom"
android:actionViewClass="android.widget.SearchView" />
</menu>
Ответ 3
Удалите строку
searchView.setIconifiedByDefault(false);
Или вы можете явно вызвать метод с true
в качестве аргумента.