自动展开并将焦点放在 SearchView

Posted

技术标签:

【中文标题】自动展开并将焦点放在 SearchView【英文标题】:Expand and give focus to SearchView automatically 【发布时间】:2012-07-27 10:40:22 【问题描述】:

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

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

应该如何解决?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我不敢说实话,抱歉。 onPrepareOptionsMenu(..) 中添加一个requestFocus() 调用对我有用。 requestFocus 对我不起作用。要“集中注意力”,您可以使用false 调用setIconified @SweSnow 你必须同时设置 ...searchView.setIconifiedByDefault(false); searchView.requestFocus(); 确保设置了菜单项属性app:showAsAction="always"。当我移除自动对焦时,图标消失了,并且出现了 3 个点图标【参考方案2】:

你也可以调用 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"
        />

【讨论】:

如果你使用AppCompat,而不是直接在searchMenuItem上调用expandActionView(),你应该使用这个:MenuItemCompat.expandActionView(searchMenuItem) @CharlesMadere 方式是唯一对我有用的方式,API 23 searchMenuItem.expandActionView();加1 MenuItemCompat.expandActionView(searchMenuItem) 现已弃用 此解决方案已弃用。【参考方案3】:

这对我有用:

menu.expandActionView();

【讨论】:

但关闭图标最初以展开形式不可见。 ***.com/questions/27706192/…【参考方案4】:

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

mSearchView.onActionViewExpanded()

【讨论】:

在布局中使用是什么意思? 我的意思是您将其称为View,而不是MenuItem 这对我不起作用。调用 setIconified() 确实如此。 也为我工作,我不知道为什么在官方网站上他们没有包含在示例代码中。我的意思是,如果我点击搜索按钮,键盘应该正确打开???【参考方案5】:

这对我有用:

在根布局中:

xmlns:app="http://schemas.android.com/apk/res-auto"

SearchView 定义如下:

 <android.support.v7.widget.SearchView
        android:id="@+id/search_contacts"
        android:layout_
        android:layout_
        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】:

如果你想拥有它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();

【讨论】:

【参考方案7】:

您可以在 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】:

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

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

使用屏幕宽度代替 xxx offcourse

【讨论】:

【参考方案9】:

如果你在一个activity里面使用你需要使用

view.onActionViewExpanded();

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

MenuItem.expandActionView();

注意:它仅适用于 SearchView

这两种情况对我有用。

【讨论】:

【参考方案10】:

android:iconifiedByDefault="true"

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

【讨论】:

【参考方案11】:

使用这个

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

【讨论】:

【参考方案12】:

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

<SearchView
                android:id="@+id/searchView"
                android:layout_
                android:layout_
                android:iconifiedByDefault="true"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:queryHint="Search"/>

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

对于 Appcompat Searchview 你可以使用这个方法:

MenuItemCompat.expandActionView(mSearchMenuItem);

【讨论】:

【参考方案15】:

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

【讨论】:

对我来说成功了,你可以试试。【参考方案16】:

在 menuItem 上调用 expandActionView()

menuItem.expandActionView()

【讨论】:

【参考方案17】:

我在使用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

【讨论】:

【参考方案18】:

科特林

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

【讨论】:

以上是关于自动展开并将焦点放在 SearchView的主要内容,如果未能解决你的问题,请参考以下文章

将焦点保存在 ExpandableListView 中的展开组上

HTML 表单 - 添加新表格行并将焦点设置在第一个输入上的脚本

Summernote - 在焦点上,在编辑器末尾插入光标

Angular 2在组件加载时将焦点放在表单的第一个字段上

AWS举行AI大会re:MARS 焦点ML自动化机器人和太空科学

用于附加全局焦点事件的 AngularJS 方式