jjzjj

Android SearchView 需要点击两次才能展开 View

coder 2023-12-20 原文

简而言之:当我点击我的 SearchViewIcon 时,SearchView 不会折叠/展开。

长:

我正在使用 SearchView 在我的 MainActivity 中的 Fragment 中过滤 RecyclerView。

当我点击 SearchViewIcon 时(SearchView 默认图标化)。我使用以下代码打开包含正确 fragment 的选项卡:

searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(2, false);
            }
        });

具有正确 fragment 的选项卡按预期打开。还显示了文本输入,但 SearchView 保持图标化。 (见下图。)

Application

我的 XML 搜索 View :

<item
    android:id="@+id/action_search"
    android:orderInCategory="1"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/menu_item_search_title"
    app:showAsAction="ifRoom"
    app:queryHint="Search name or function"
    app:actionViewClass="android.support.v7.widget.SearchView" />

我已经尝试过的事情:

将我的 showAsAction 设置为 always 或 ifRoom|collapseActionView

app:showAsAction="always"
app:showAsAction="ifRoom|collapseActionView"

请求关注我的 SearchView:

searchView.requestFocus();

展开我的 SearchViewItem:

MenuItem searchViewItem = menu.findItem(R.id.action_search);
searchViewItem.expandActionView();

但是这些都没有用...

编辑 正如标题所说,如果我再次单击 SearchViewIcon,SearchView 会展开。

最佳答案

我也遇到过类似的问题,并且能够解决。 我需要解决的主要问题是:

  1. searchView 默认不展开
  2. 搜索 EditText 直到第二次点击才获得焦点
  3. 即使在解决了 (2) 之后,键盘直到第二次点击才出现

解决方案:

  1. 在 menu.xml 中需要将 app:showAsAction 定义为 "collapseActionView" + 在 java 代码中还需要调用 searchView.setIconifiedByDefault(false) 用于扩展优先于图标化(即 - 当按下图标时,展开并且不要停留在图标模式)
  2. 为您的 search menu-item object 添加一个 MenuItem.OnActionExpandListener 并使用处理程序发布一个 runnable 请求焦点到您的 search-view 对象。 (为什么是可运行的?因为当菜单仍未完全膨胀时请求焦点不能保证工作。在处理程序可运行中请求焦点时,我确保焦点请求发生在 onCreateOptionsMenu( ) 准备就绪并完成。
  3. 在与 (2) 相同定义的 runnable 中,也要求 android OS 显示键盘。

解决所有这些问题的完整代码:

menu.xml:

    <item
    android:id="@+id/searchContacts"
    android:icon="@drawable/ic_search_white_24dp"
    android:title="search"
    app:showAsAction="collapseActionView|always"
    app:actionViewClass="android.widget.SearchView"
    />
 <!-- and of course your other menu items -->

searchable configuration:

需要创建这样的xml文件。 右键单击您的 res 文件夹并选择 new --> android resource file。把你想要的任何东西作为文件名(例如,“可搜索的”就可以了),然后选择 XML 作为资源类型。 然后将此代码复制并粘贴到创建的文件中(用您自己的提示字符串替换提示字符串):

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="put here your hint string to be shown"
    />

MainActivity:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu, menu);
        implementSearch(menu);
        return true;
    }

    private void implementSearch(final Menu menu) {
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        final MenuItem searchMenuItem = menu.findItem(R.id.searchContacts);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);

        searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener(){
            @Override
            public boolean onMenuItemActionExpand(MenuItem item){
                // the search view is now open. add your logic if you want
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        searchView.requestFocus();
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        if (imm != null) { // it's never null. I've added this line just to make the compiler happy
                            imm.showSoftInput(searchView.findFocus(), 0);
                        }


                    }
                });
                return true;
            }


            @Override
            public boolean onMenuItemActionCollapse(MenuItem item){
                // the search view is closing. add your logic if you want
                return true;
            }

        });

    }

此外,如果您想使用自己的回调来进行搜索的文本更改和提交(而不是 Android Intent ),请在 implementSearch() 方法中添加对 searchMenuItem.setOnActionExpandListener 的调用(新的 SearchView.OnQueryTextListener({...}))

查看this SO question了解更多详情

关于Android SearchView 需要点击两次才能展开 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505300/

有关Android SearchView 需要点击两次才能展开 View的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  5. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  9. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  10. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

随机推荐