Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
285 views
in Technique[技术] by (71.8m points)

android - SearchView in OptionsMenu not full width

I have a working SearchView which expands in my OptionsMenu when the user taps on the search icon. However it only expands within the available space among the other OptionsMenu icons. On a wide screen this is fine, but with a narrow space there is only room to show 5-10 charaters in the search box. I want it to overlay the other icons such as it does for the Android Contacts app. Currently, I'm building with targetSdkVersion = 17. Hopefully I'm missing something simple :)

(Note added later: the only solution I've found workable so far is to hide all the menu icons when I want to expand the search icon. This is conceptually simple. But it is messy because when restoring hidden icons, one has to go through a bunch of logic to figure out which ones to restore, or keep state variables around, etc.)

Here's my item xml in for the OptionsMenu:

<item
  android:id="@+id/menu_search_shallow"
  android:title="Search Current Folder"
  android:icon="@drawable/ic_btn_search"
  android:showAsAction="always|collapseActionView"
  android:actionViewClass="android.widget.SearchView" />

I also have in my main activity code:

@Override
public boolean onCreateOptionsMenu (Menu menu)
{
  getMenuInflater().inflate(R.menu.nav_menu, menu);
  this.optionsMenu = menu;

  MenuItem searchItem = menu.findItem (R.id.menu_search_shallow);
  searchItem.setOnActionExpandListener (this);
  SearchView searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_shallow_hint));

  searchItem = menu.findItem (R.id.menu_search_deep);
  searchItem.setOnActionExpandListener (this);
  searchView = (SearchView) searchItem.getActionView();
  searchView.setQueryHint (getString (R.string.search_deep_hint));
}

and

@Override
public boolean onMenuItemActionExpand(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setOnQueryTextListener (this);
  return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) 
{
  SearchView searchView = (SearchView) item.getActionView();
  searchView.setQuery ("", false);
  return true;
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Instead of creating a new layout I set the MaxWidth programmatically in onCreateOptionsMenu():

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_search, menu);
    SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
    searchView.setMaxWidth(Integer.MAX_VALUE);
    ....

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...