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 в качестве аргумента.