自动扩展并将焦点放在SearchView上

82

我正在开发一个应用程序,用户在 ActionBar 中按下“搜索”图标后,在屏幕顶部会出现一个可见的 SearchView

我的问题是 SearchView 没有聚焦或展开,因此用户必须按下 SearchView 上的搜索按钮才能将其展开并弹出键盘。

如何解决这个问题?

20个回答

113

你也可以调用expandActionView()方法以强制展开它:

@Override
public boolean onCreateOptionsMenu( Menu menu )
{
    super.onCreateOptionsMenu( menu );

    MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
    searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query

    return true;
}

在操作栏布局中搜索项目:

<item
        android:id="@+id/mi_search"
        android:icon="@drawable/abs__ic_search_api_holo_light"
        android:title="@string/search"
        android:showAsAction="ifRoom|collapseActionView"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        />

47
如果你使用AppCompat,而不是直接在searchMenuItem上调用expandActionView(),你应该使用这个方法:MenuItemCompat.expandActionView(searchMenuItem)。请注意,此方法可以帮助兼容旧版本的Android系统。 - Charles Madere
@CharlesMadere 的方法是唯一对我有效的,API 23。 - Lampione
searchMenuItem.expandActionView(); 加 1。 - Vlad
3
MenuItemCompat.expandActionView(searchMenuItem) 现在已经过时了。 - luckyhandler
此解决方案已被弃用。 - Favour Felix Chinemerem
最后,一个使用showAsAction(ifRoom|collapseActionView)。此外,我还需要添加:searchView.setIconifiedByDefault(false) - Diego

108
为了使SearchView默认展开,初始化时调用setIconifiedByDefault(false)方法(例如在onCreateOptionsMenu(..)onPrepareOptionsMenu(..)中)。大多数情况下,这将自动使其获得焦点,但如果没有,请在其上调用requestFocus()方法。

5
说实话,我不确定,抱歉。 - Alex Curran
8
onPrepareOptionsMenu(..)中添加一个requestFocus()调用对我很有帮助。 - The Dirty Calvinist
3
对我来说,“requestFocus”无法使用。要“聚焦”,可以使用setIconifiedfalse参数。 - Peter Chaula
1
@SweSnow 你需要同时设置...searchView.setIconifiedByDefault(false); searchView.requestFocus(); - pallav bohara
4
请确保已经设置了菜单项属性 app:showAsAction="always"。当我移除了自动聚焦功能后,图标消失了,取而代之的是三个点的图标。 - Riccardo

66

如果你想要默认情况下以图标形式显示它,这对我有效。需要使用 setFocusablesetIconified 方法。

如果您希望其默认为图标化显示,则此方法适用于我。需要使用 setFocusablesetIconified 方法。

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconifiedByDefault(true);
    searchView.setFocusable(true);
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();
更新:如果您正在使用android.support.v7.widget.SearchView,那么行为会非常不同。如果您不希望键盘一直弹出,请使用clearFocus。出于某种原因,在使用appcompat时菜单总是被重新创建。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();

27
如果您在布局中使用它,可以调用 mSearchView.onActionViewExpanded()

在布局中使用的含义是什么? - Pascalius
3
我的意思是你将其称为“视图”,而不是“菜单项”。 - riwnodennyk
那对我没用。但是调用 setIconified() 就可以了。 - MrPlow
对我也起作用了,我不确定为什么官方网站没有在示例代码中包含它。我的意思是,如果我点击搜索按钮,键盘应该打开,对吧? - Tushar Srivastava

8
这对我有用:
在根布局中:
xmlns:app="http://schemas.android.com/apk/res-auto"

SearchView定义如下:

 <android.support.v7.widget.SearchView
        android:id="@+id/search_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="15dp"
        android:background="@drawable/search_view"        
        app:iconifiedByDefault="false"
        app:queryHint="Search name or email"
        >

        <requestFocus />
    </android.support.v7.widget.SearchView>

区别在于应用程序标签。
app:iconifiedByDefault="false"
app:queryHint="Search name or email"

6
如果您在活动中使用,您需要使用:
view.onActionViewExpanded();

如果您正在使用内部菜单选项,则需要使用:
MenuItem.expandActionView();

注意:它仅适用于SearchView。
这两种情况对我有效。

4
这对我有用:

这对我有用:

menu.expandActionView();

1
但是在展开的形式下,关闭图标最初不可见。http://stackoverflow.com/questions/27706192/how-to-display-searchview-close-icon-when-expanded-in-android/ - Shadow

2

@Pascalius的答案对我有用。但是每次关闭SearchView并再次点击时,焦点都会丢失。因此,我将代码插入到setOnMenuItemClickListener中,如下所示:

MenuItem item = menu.findItem(R.id.action_search);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();

item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        searchView.setIconifiedByDefault(true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();

        return false;
    }
});

2

Kotlin

var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true

2

使用这个

SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
                SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
                searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
                searchView.setIconifiedByDefault(false);
                searchView.setQueryHint("Search");
                menu.findItem(R.id.action_search).setActionView(searchView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接