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

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

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

应该如何解决?

【问题讨论】:

    标签: android search focus expand


    【解决方案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();
    

    【讨论】:

    【解决方案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_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】:

      如果你想拥有它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_width="match_parent"
                                  android:layout_height="wrap_content"
                                  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
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2015-10-23
                              • 2015-08-16
                              • 1970-01-01
                              • 2023-01-03
                              • 2018-07-15
                              相关资源
                              最近更新 更多