3

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

Screenshot

Кроме того, я также имеющий точно такую ​​же проблему, описанную в этом вопросе: ActionBar always expanded SearchView with the icon inside

Это 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; 
} 

ответ

9

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

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

<?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); 
} 
+0

Привет, Бронкс, благодарю вас за ответ, но он не работает. Я попытался использовать приложение: showAsAction = "always", а также удалив 'android: orderInCategory =" 100 "', но не повезло. – MatteoBelfiori

+1

Привет, Галарон, я обновил свой ответ, элемент поиска пропустил действие «collapseActionView» – Bronx

+1

С вашим обновленным ответом мое другое действие видимо, но не отображается как «меню переполнения» (три точки один над другим) и, что гораздо важнее, мой поиск начинается с именованных и не открывается, даже если я нажму на него. Извините, если я могу появиться как-то noobish, но это было очень долгое время с тех пор, как я последний раз закодирован для Android. – MatteoBelfiori

0

Я завершает этот ответ спасибо ссылка отправленный Бронксе в своем последнем посте и другой ответ, как этот Android - cannot find TextView inside SearchWidget when using Android Support library (принят ответ): двигаться увеличить значок внутри текстовом, я удалить эту строку из первого ответа Бронкса

searchView.setIconifiedByDefault(false); 

Тогда я вставил это только abfter код Бронкс:

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 относится к пользовательской строке в моем проекте, поэтому изменить его с вашим. Еще раз спасибо Бронксу.