Android расширенный SearchView делает другие элементы панели действий исчезают
Я столкнулся с некоторыми проблемами с SearchView в контекстной панели действий, вызванной фрагментом. Главная из них заключается в том, что когда мой SearchView расширяется, он заставляет исчезнуть все другие элементы в панели действий (кроме кнопки закрытия), даже если есть некоторое неиспользуемое пространство, как вы можете видеть на этом скриншоте:
Кроме того, у меня также есть та же самая точная проблема, обсуждаемая в этом вопросе: панель действий всегда расширяется 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.Обратный вызов
@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" не исчез при коллапсе searchview, вам нужно установить 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);
Затем я вставил этот код просто abfter Bronx:
Просто обратите внимание, что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
ссылается на пользовательскую строку в моем проекте, поэтому измените ее с помощью вашего. Спасибо снова в Бронкс.