展开并自动关注SearchView

Swe*_*now 70 search expand android focus

我开发了用户按压在"搜索"图标的应用程序ActionBar并且SearchView在屏幕的顶部可见.

我的问题是它SearchView没有聚焦也没有扩展,所以用户必须按下它上面的搜索按钮Searchview才能使其展开并带出键盘.

该如何解决?

小智 104

您还可以调用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;
}
Run Code Online (Sandbox Code Playgroud)

操作栏布局中的搜索项:

<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"
        />
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的[程序兼容性(https://developer.android.com/tools/support-library/features.html#v7-appcompat),而不是调用`expandActionView()`直接在`searchMenuItem`,你应该使用相反:`MenuItemCompat.expandActionView(searchMenuItem)`. (46认同)
  • 现在不推荐使用 MenuItemCompat.expandActionView(searchMenuItem) (2认同)

Ale*_*ran 86

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

  • 在`onPrepareOptionsMenu(..)`中添加`requestFocus()`调用对我来说很有用. (8认同)
  • 它工作但我如何让键盘出现? (5认同)
  • 对不起,我不确定是否诚实. (5认同)
  • 一定要设置菜单项属性`app:showAsAction="always"`。当我移除自动对焦时,图标消失了,出现了 3 点图标 (3认同)
  • `requestFocus`对我不起作用。为了“聚焦”,你可以调用`setIconified`和`false`。 (2认同)

Pas*_*ius 50

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

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconifiedByDefault(true);
    searchView.setFocusable(true);
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();
Run Code Online (Sandbox Code Playgroud)

更新:如果您使用android.support.v7.widget.SearchView我们的行为非常不同.clearFocus如果您不想一直弹出键盘,则需要它.出于某种原因,在使用appcompat时,菜单会一直重新创建.

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();
Run Code Online (Sandbox Code Playgroud)


riw*_*nyk 25

如果你在布局中使用它,你可以打电话

mSearchView.onActionViewExpanded()

  • 我的意思是你把它称为`View`,而不是'MenuItem` (3认同)

Par*_*hta 8

这对我有用:

在根布局中:

xmlns:app="http://schemas.android.com/apk/res-auto"
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

不同之处在于app标签.

app:iconifiedByDefault="false"
app:queryHint="Search name or email"
Run Code Online (Sandbox Code Playgroud)


sai*_*ali 5

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

view.onActionViewExpanded();
Run Code Online (Sandbox Code Playgroud)

如果您正在使用内部菜单选项,则需要使用

MenuItem.expandActionView();
Run Code Online (Sandbox Code Playgroud)

注意:仅适用于SearchView

这两种情况都为我工作。