79

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

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

这应该如何解决?

4

18 回答 18

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"
        />
于 2013-03-30T17:34:44.507 回答
103

要使 SearchView 默认展开,请在初始化时调用setIconifiedByDefault(false)onCreateOptionsMenu(..) (例如 in或onPrepareOptionsMenu(..))。我发现在大多数情况下,这会自动给它焦点,但如果不是简单地调用requestFocus()它。

于 2012-07-29T14:41:43.140 回答
60

如果你想拥有它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();
于 2015-04-26T09:48:02.870 回答
26

如果你在布局中使用它,你可以调用

mSearchView.onActionViewExpanded()

于 2013-12-02T18:31:09.053 回答
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"
于 2015-02-08T08:33:03.280 回答
6

如果您在活动中使用,则需要使用

view.onActionViewExpanded();

如果您使用的是内部菜单选项,则需要使用

MenuItem.expandActionView();

注意:它仅适用于 SearchView

这两种情况对我有用。

于 2016-05-18T09:42:32.667 回答
4

这对我有用:

menu.expandActionView();
于 2013-08-08T13:54:49.580 回答
2

您可以SearchView#setIconified()在 Java 代码中的 SearchView 句柄上使用该方法。更多在这里:

http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)

您也可以使用SearchView#setIconifiedByDefault(). 更多信息在这里:

http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)

于 2015-05-27T13:59:32.617 回答
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;
    }
});
于 2017-09-10T02:26:58.230 回答
2

科特林

var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true
于 2021-05-26T07:49:08.560 回答
2

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

MenuItemCompat.expandActionView(mSearchMenuItem);
于 2017-09-19T13:31:22.823 回答
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);
于 2017-07-12T12:09:44.990 回答
1

我很难做到这一点SearchView widget,但expandActionView() method实际上是在 MenuItem 类中定义的,而不是 SearchView 类。所以,我解决了它

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView   searchView = (SearchView) searchItem.getActionView();
        searchItem.expandActionView();//the method expandActionView is called on searchItem not searchView
于 2020-11-07T15:50:47.700 回答
1

调用expandActionView()menuItem。

menuItem.expandActionView()
于 2020-05-21T02:45:17.443 回答
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>

于 2020-03-04T06:50:16.547 回答
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

于 2015-07-30T11:28:14.033 回答
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"/>
于 2017-08-24T18:27:20.903 回答
-2

android:iconifiedByDefault="true"

以上是 XML 中的代码,帮助我在单击时扩展并自动聚焦在搜索视图上:

于 2017-01-27T13:32:09.600 回答