В расширенном Android SearchView другие элементы ActionBar исчезают

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

Скриншот

Кроме того, у меня также есть та же самая проблема, обсуждаемая в этом вопросе: ActionBar всегда расширял SearchView со значком внутри

Это код XML моего SearchView:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_series_cab_search"
        android:icon="@drawable/ic_search"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />
</menu>

И это код JAVA моего фрагмента, который реализует ActionMode.Callback

@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mode.getMenuInflater().inflate(R.menu.menu_series_cab, menu);
    mSearchView = (SearchView) MenuItemCompat
            .getActionView(menu.findItem(R.id.menu_series_cab_search));
    mSearchView.setQueryHint(getResources().getString(R.string.action_search));
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            mSearchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            return false;
        }
    });
    mSearchView.setIconifiedByDefault(false);
    return true;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    mSearchView.requestFocus();
    return true;
}

2 ответа

Решение

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

Если вы хотите, чтобы ваш элемент "action_settings" не исчезал при срыве поиска, вам нужно установить app:showAsAction="always"

<?xml version="1.0" encoding="utf-8"?>

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

И ваш код Java должен быть таким:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.main, menu);


    MenuItem searchItem = menu.findItem(R.id.action_search);
    // Get the SearchView and set the searchable configuration
    searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) MenuItemCompat.getActionView(searchItem);//MenuItemCompat.getActionView(searchItem);//menu.findItem(R.id.action_search).getActionView();
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    super.onCreateOptionsMenu(menu, inflater);
}

Я заканчиваю этот ответ благодаря ссылке, размещенной Бронксом в его последнем сообщении, и другим ответом, подобным этому Android - не могу найти TextView внутри SearchWidget при использовании библиотеки поддержки Android (принятый ответ): чтобы переместить значок увеличения в текстовом представлении, я удаляю эту строку из первого ответа Бронкса

searchView.setIconifiedByDefault(false);

Затем я вставил это сразу после кода Бронкса:

    AutoCompleteTextView autoComplete = (AutoCompleteTextView)mSearchView.findViewById(R.id.search_src_text);
    Class<?> clazz = null;
    try {
        clazz = Class.forName("android.widget.SearchView$SearchAutoComplete");
        SpannableStringBuilder stopHint = new SpannableStringBuilder("  ");
        stopHint.append(getString(R.string.action_search));
        // Add the icon as an spannable
        Drawable searchIcon = getResources().getDrawable(R.drawable.abc_ic_search_api_mtrl_alpha);
        Method textSizeMethod = clazz.getMethod("getTextSize");
        Float rawTextSize = (Float)textSizeMethod.invoke(autoComplete);
        int textSize = (int) (rawTextSize * 1.25);
        searchIcon.setBounds(0, 0, textSize, textSize);
        stopHint.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        // Set the new hint text
        Method setHintMethod = clazz.getMethod("setHint", CharSequence.class);
        setHintMethod.invoke(autoComplete, stopHint);
    } catch (Exception e) {
        // Set default hint
        mSearchView.setQueryHint(getResources().getString(R.string.action_search));
        e.printStackTrace();
    }

Просто обратите внимание, что R.string.action_search относится к пользовательской строке в моем проекте, поэтому измените ее на свою. Еще раз спасибо Бронксу.