扩展并自动将焦点赋予SearchView


74

我正在开发一个应用程序,用户可以在其中按“搜索”图标,ActionBarSearchView在屏幕顶部显示a。

我的问题是键盘SearchView既没有聚焦也没有展开,因此用户必须按上的搜索按钮Searchview使其展开并拿出键盘。

应该如何解决?

Answers:


96

要使SearchView在默认情况下展开,请在初始化它时(例如在或中)对其调用setIconifiedByDefault(false)。我发现在大多数情况下,这将使它自动聚焦,但即使不是简单地调用它,也是如此。onCreateOptionsMenu(..)onPrepareOptionsMenu(..)requestFocus()


5
抱歉,我不确定。
亚历克斯·柯伦

8
加个requestFocus()电话onPrepareOptionsMenu(..)对我有用。
肮脏的加尔文主义者

3
requestFocus对我不起作用。以“专注”可以调用setIconifiedfalse
peterchaula

1
@SweSnow您必须同时设置... searchView.setIconifiedByDefault(false); searchView.requestFocus();
pallav bohara

3
确保已设置菜单项属性app:showAsAction="always"。当我取消自动对焦时,该图标消失了,并出现了3点图标
Riccardo Bonesi

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,而不是expandActionView()直接在上调用searchMenuItem,则应改用:MenuItemCompat.expandActionView(searchMenuItem)
Charles Madere 2014年

@CharlesMadere方法是唯一对我有用的方法,API 23
Matteo,

加上1searchMenuItem.expandActionView();
弗拉德(Vlad)

2
MenuItemCompat.expandActionView(searchMenuItem)现在已弃用
luckyhandler

不建议使用此解决方案。
Felix Favor Chinemerem

55

如果您想拥有它iconifiedByDefault,这对我有用。setFocusable并且setIconified是必需的。

    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();

25

如果您在布局中使用它,可以致电

mSearchView.onActionViewExpanded()


在布局中使用是什么意思?
Pascalius 2015年

3
我的意思是您将其称为View不是MenuItem
-riwnodennyk

那对我没用。调用setIconified()确实可以。
MrPlow 2015年

也为我工作,我不确定为什么在官方网站中没有将它们包含在示例代码中。我的意思是,如果我单击搜索按钮,键盘应该会正确打开???
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

这两种情况都为我工作。




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);

2

对于Appcompat Searchview,可以使用以下方法:

MenuItemCompat.expandActionView(mSearchMenuItem);

1

@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;
    }
});

0

MenuItemCompat的SearchView具有一个名为maxWidth的属性。

final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);

使用屏幕宽度而不是xxx offcourse


0

我使用的是android.widget Searchview,默认情况下是图标化的。xml中的以下代码可帮助我使其扩展并在单击时自动聚焦于搜索视图:

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:iconifiedByDefault="true"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:queryHint="Search"/>

0

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

<pre>

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

</pre>


它对我来说是成功的,所以您可以尝试一下。
chandan raj


0

我在用时很难SearchView widget,但是expandActionView() method实际上是在MenuItem类而不是SearchView类中定义的。所以,我解决了

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView   searchView = (SearchView) searchItem.getActionView();
        searchItem.expandActionView();

希望对您有所帮助。:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.