我试图在我的应用程序中创建一个操作栏搜索,但在展开状态下,SearchView没有占据整个操作栏宽度(仍然显示其他操作)!
那么,如何使SearchView填充整个操作栏区域(与GMAIL应用程序一样)?
我试图在我的应用程序中创建一个操作栏搜索,但在展开状态下,SearchView没有占据整个操作栏宽度(仍然显示其他操作)!
那么,如何使SearchView填充整个操作栏区域(与GMAIL应用程序一样)?
以上的解决方案都不适用于我。设置SearchView的MaxWidth对我有用:
@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);
明白了
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_swipe_tabbed, menu);
MenuItem searchViewItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchViewItem.getActionView();
searchView.setIconifiedByDefault(false);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
searchView.setLayoutParams(params);
searchViewItem.expandActionView();
return true;
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MySwipeTabbedActivity" >
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="always|collapseActionView"
android:actionViewClass="android.widget.SearchView"
/>
<item android:id="@+id/action_share"
android:title="Share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom" />
<item android:id="@+id/action_settings"
android:title="Settings"
android:icon="@android:drawable/ic_menu_preferences"
android:showAsAction="never" />
</menu>
[可选] 防止searchView折叠:
searchViewItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false; //never collapse
}
});
@Hiep给出的答案是正确的,我按照这些步骤来获得我的解决方案。但是我正在使用ActionBarCompact库,所以需要进行一些修改才能使其正常工作。如果你正在使用AppCompact,那么这个解决方案是Hiep的修改版。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:materialdesign="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
android:title="search"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
materialdesign:showAsAction="always|collapseActionView"
materialdesign:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
在主类中的onCreateOptionsMenu方法中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my_swipe_tabbed, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
searchView.setLayoutParams(params);
searchView.setIconified(false);
MenuItemCompat.expandActionView(searchItem);
return super.onCreateOptionsMenu(menu);
}
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
/* (non-Javadoc)
* @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionExpand(android.view.MenuItem)
*/
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
/* (non-Javadoc)
* @see android.support.v4.view.MenuItemCompat.OnActionExpandListener#onMenuItemActionCollapse(android.view.MenuItem)
*/
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return false;
}
});
Thank you
只尝试这个,它会起作用并保持所有其他项设置为 ifRoom
<item
android:id="@+id/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="@string/action_search"
app:showAsAction="always"/>
是的,我真的很晚 :)
但我想分享另一种替代方案。这个想法就是在SearchView
展开时隐藏分组菜单项。
步骤1:
对菜单项进行分组。请确保搜索视图项的showAsAction
为app:showAsAction="collapseActionView|always"
<group android:id="@+id/myMenuGroup">
<item
android:id="@+id/actionSearch"
android:icon="@drawable/ic_search"
android:title="@string/search"
app:actionViewClass="android.widget.SearchView"
app:iconTint="@color/textColorVariant2"
app:showAsAction="collapseActionView|always" />
<item
android:id="@+id/actionFilter"
android:icon="@drawable/ic_filter"
android:orderInCategory="0"
android:title="@string/filter"
app:iconTint="@color/textColorVariant2"
app:showAsAction="ifRoom" />
..... </group>
步骤2:在onPrepareOptionsMenu()
回调中获取菜单引用
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
super.onPrepareOptionsMenu(menu)
this.menu = menu // this.menu is a global scoped variable
return true
}
步骤 3
将 MenuItem.OnActionExpandListener
添加到您的活动中,并像下面一样实现 onMenuItemActionExpand()
和 onMenuItemActionCollapse()
override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
menu?.setGroupVisible(R.id.myMenuGroup, false)
return true
}
override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
menu?.setGroupVisible(R.id.myMenuGroup, true)
return true
}
这种方法将完全扩展SearchView
到ActionBar
内部,即使存在其他menu
图标也是如此。