展开并自动关注SearchView

时间:2012-07-29 14:32:26

标签: android search focus expand

我正在开发一个应用程序,用户按下"搜索"屏幕顶部显示ActionBar中的图标和SearchView

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

如何解决这个问题?

18 个答案:

答案 0 :(得分: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;
}

操作栏布局中的搜索项:

<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"
        />

答案 1 :(得分:79)

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

答案 2 :(得分:47)

如果你想拥有它iconifiedByDefault,这对我有用。需要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();

答案 3 :(得分:22)

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

mSearchView.onActionViewExpanded()

答案 4 :(得分:7)

这对我有用:

在根布局中:

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标签。

app:iconifiedByDefault="false"
app:queryHint="Search name or email"

答案 5 :(得分:5)

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

view.onActionViewExpanded();

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

MenuItem.expandActionView();

注意:它仅适用于SearchView

这两种情况对我有用。

答案 6 :(得分:4)

这对我有用:

menu.expandActionView();

答案 7 :(得分:2)

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

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

您还可以使用SearchView#setIconifiedByDefault()。更多信息:

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

答案 8 :(得分: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);

答案 9 :(得分:1)

@Pascalius的回答对我有用。但每次关闭SearchView并再次单击时,都会丢失Focus。所以我将代码插入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;
    }
});

答案 10 :(得分:0)

科特林

['6.69223420722764', '6.69222819326484', '6.69221180776184', '6.69219149698336', '6.69217949340067', '6.69217956546811', '6.69218526127669', '6.692200130301', '6.69220511560768', '6.69221372090576', '6.69222707128915', '6.69223420722764']
['51.1329165124371', '51.1329081193748', '51.1329013203209', '51.1329073049609', '51.1329244260894', '51.1329430447612', '51.1329578171713', '51.1329606289999', '51.1329581192089', '51.1329518135339', '51.132939215911', '51.1329165124371']

答案 11 :(得分:0)

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

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

我希望它会有所帮助。 :)

答案 12 :(得分:0)

在菜单项上调用expandActionView()

menuItem.expandActionView()

答案 13 :(得分: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>

答案 14 :(得分:0)

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

MenuItemCompat.expandActionView(mSearchMenuItem);

答案 15 :(得分: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"/>

答案 16 :(得分:0)

android:iconifiedByDefault="true"

你的xml文件中的

答案 17 :(得分: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