如何向 ActionBar 添加 SearchWidget?

2023-12-25

我正在尝试将 Search-ActionView 添加到我的应用程序中(如此处所述http://developer.android.com/guide/topics/search/search-dialog.html#UsingSearchWidget http://developer.android.com/guide/topics/search/search-dialog.html#UsingSearchWidget)。不幸的是,我不断收到 NullPointerException,并且很难检测到底出了什么问题。

我创建了一个可搜索的配置和一个可搜索的活动,如 android 页面所示。我的菜单 .xml 文件如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    ...
    <item
        android:id="@+id/menu_item_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/icon_search"
        android:showAsAction="always"
        android:title="@string/action_bar_button_search">
    </item>

</menu>

这是抛出异常的方法:

public boolean onCreateOptionsMenu( Menu menu )
{
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate( R.menu.action_bar, menu );

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();

    // NullPointerException thrown here; searchView is null.
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false);

    return super.onCreateOptionsMenu( menu );
}

完整的堆栈跟踪:

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.activities.Test.onCreateOptionsMenu(Test.java:41)
at android.app.Activity.onCreatePanelMenu(Activity.java:2444)
at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:408)
at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:759)
at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2997)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)

由于这个问题经常被查找,而且我一次又一次地偶然发现了同样的问题,这里有一个小跟进,它跟踪创建 SearchWidget 的所有必要步骤。

不过,SearchWidget 有一个棘手的部分:如果您在 searchable.xml 中使用硬编码字符串而不是资源,应用程序将崩溃并显示令人困惑的错误消息。这花了我一生太多的时间......

  1. 创建一个 Activity 来处理搜索结果

    public class Search extends Activity {}
    
  2. 将文件“searchable.xml”添加到 res/xml 目录(使用资源作为提示和标签!)

    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:hint="@string/search_hint"
        android:includeInGlobalSearch="false"
        android:label="@string/search_label"
        android:searchSettingsDescription="@string/search_global_description" />
    
  3. 在 res/menu 目录中创建正确的菜单项“main.xml”

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <item
           android:id="@+id/options_menu_main_search"
           android:actionViewClass="android.widget.SearchView"
           android:icon="@drawable/icon_magnifier"
           android:showAsAction="always"
           android:title="Search"/>
    
    </menu>
    
  4. 更新您的 Manifest.xml:添加搜索活动并指定哪些活动可以接收搜索意图。添加<meta-data android:name="android.app.default_searchable" android:value=".app.Search" /> to an activity节点使其可搜索。将其添加到application节点使所有活动都可搜索。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application>
            <meta-data
                android:name="android.app.default_searchable"
                android:value=".app.Search" />
    
            <activity android:name=".activities.Search" >
                <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
    
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
    </application>
    
  5. 将 SearchManager 添加到应提供 SearchWidget 的每个活动中的 ActionView

    public class Activity extends android.app.Activity
    {
        @Override
        public boolean onCreateOptionsMenu( Menu menu )
        {
            getMenuInflater().inflate( R.menu.main, menu );
    
            // Add SearchWidget.
            SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
            SearchView searchView = (SearchView) menu.findItem( R.id.options_menu_main_search ).getActionView();
    
            searchView.setSearchableInfo( searchManager.getSearchableInfo( getComponentName() ) );
    
            return super.onCreateOptionsMenu( menu );
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向 ActionBar 添加 SearchWidget? 的相关文章

  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • Crashlytics 生成符号 gradle 步骤失败:超出 GC 开销限制

    我正在将项目从 gradle 版本 3 3 转换为 4 10 1 该项目主要是使用自定义构建步骤构建的 C 代码 而不是 CMake externalNativeBuild 或 Android mk ndkBuild 它生成以下库 arme
  • 与 malloc/free 相比,使用 C99 VLA 是一个好主意吗?

    使用 C99 VLA 是个好主意吗 与 malloc free 相比 什么时候使用 VLA 合适 因为 VLA 可能会炸毁堆栈 是的 除非你知道你的堆栈可能会爆炸 如果有必要 您还可以更改堆栈的大小 每个操作系统的情况有所不同 但这是可能的
  • 如何撤消“ git rm -r -f * ”

    我第一次使用git 我有一个目录 其中写有多个程序 并执行了以下步骤 I did git add then git commit 然后我收到一条消息Aborting commit due to empty commit message 然后
  • 使用 Runspace Factory for Powershell 出现错误

    我在下面的使用行中收到以下错误 直到我在这家新公司开始工作之前我从未见过它 System PlatformNotSupportedException 此平台不支持 ReflectionOnly 加载 在 System Reflection
  • “ASP.NET Core 运行时 6.0.10 x64”的 ClickOnce 先决条件

    I am using ClickOnce in Visual studio I can set net desktop runtime 6 0 10 x64 and net runtime 6 0 10 x64 prerequisite I
  • 如何知道运行时哪个 Linq 语句生成了现有的 SQL?

    我希望以某种方式编写实体框架或 LINQ to SQL 查询 以便当我在 SQL Server Profiler 中看到 SQL 查询时 我可以快速识别哪个 LINQ 语句生成该 SQL 而无需进入调试器并跟踪它 该应用程序不会使用存储过程
  • 从属性 python 3 动态更改类父级

    我希望新类根据创建实例时给定的属性动态地从不同的父类继承 到目前为止我已经尝试过这样的事情 class Meta type chooser None def call cls args kwars if kwargs thingy opti
  • 更新后允许按钮不起作用

    在安装了 Android Marshmallow 最新更新的设备上 即June2016 https source android com security bulletin 2016 06 01 html更新 当我请求权限时 允许 按钮不起
  • 如何声明线程向量

    我是 C 编程新手 需要一些帮助来使用带有向量库的线程库 首先我遵循这个tutorial https solarianprogrammer com 2012 02 27 cpp 11 thread tutorial part 2 但编译器
  • 在 xcode 项目中的目标之间共享数据[重复]

    这个问题在这里已经有答案了 我有一个具有两个不同目标的项目 同一应用程序的免费版本和付费版本 并且我有一个list以及我保存到的项目NSUserDefaults 我的问题是 有没有办法在应用程序的两个版本之间共享此列表 而不使用KeyCha
  • 如何禁用 Android 特定标签的内部日志记录(例如 AbsListView、GestureDetector、endeffect)

    Intro 我正在开发一个 Android 应用程序 似乎在强大的系统中启用了一些持久日志记录 请参阅下面的一些示例 我正在我的 Galaxy S4 设备 4 2 2 上通过 Eclipse 进行调试 这是我在中看到的日志消息类型的列表Lo
  • 从 C# 中的 DataTable 中删除列

    我有一个数据集 我从中获取一个数据表 我从函数调用中传回该数据表 它有 15 20 列 但我只想要 10 列数据 有没有办法删除我不想要的那些列 将 DataTable 复制到另一个只定义了我想要的列的数据表 或者迭代集合并只使用我需要的列
  • javac 调试信息选项 -g:vars 的作用是什么?

    到底是什么 g vars 局部变量调试信息 javac 选项作为输出提供 进行一些测试 没有附加信息 例如 g source lines 和 g source lines vars 之间没有区别 有人有这些局部变量调试信息的示例吗 The
  • 从 WCF 服务捕获 SOAP 主体

    我使用 WCF 服务和 WSDL 对象来构建主体 我需要捕获 SOAP 消息正文请求 响应 我不需要编辑消息 只需看一眼或保存 记录即可 我已经尝试使用 WCF 消息日志记录 如下所示 http msdn microsoft com en
  • 在vim中,如何将“args”设置为“grep -l”的结果?

    为了说明这一点 以下是如何从命令行执行此操作 vim grep hello Rl 这将打开 vim 其中包含所有包含 hello 的文件 l 仅给出文件名 我想做同样的事情 但是是在 vim 内部 从概念上讲 是这样的 不起作用 args
  • Cocoa-Touch,核心数据:如何删除实体的所有对象?

    我有一个应用程序 使用 Core Data 和 SQLite 存储 在某些时候 我想删除一些实体的所有对象 可能有近千个物体 据我通过谷歌和官方文档所知 删除对象的唯一方法是 managedObjectContext deleteObjec
  • 如何以编程方式检查 X509 证书是否已在 Java 信任库中?

    我正在开发一个客户端 GUI 它接受自签名服务器证书并将其添加到信任存储中 就像任何浏览器一样 问题是我的客户端应用程序每次启动时都会要求提供证书 换句话说 它不记得该证书已经在信任存储中 我该如何实施 这就是我编写信任存储文件的方式 pu
  • WPF 刷新绘图是否与 Windows 窗体类似?

    因此 如果我有一个 WPF 窗口 在 WPF 窗口上移动另一个窗口是否会导致 WPF 窗口像 Windows 窗体一样进行数千次重绘 我想知道在这种情况下使用矢量的效果 而不是像窗口窗体那样基于位图的一切 你可以看一下WPF架构 http
  • 如何处理WinRT异常导致的Exception?

    如果 Windows 运行时类型引发 COM 错误 NET 似乎经常 或总是 将此错误包装到一个Exception实例 错误消息包括 COM HRESULT 错误代码 例如 当将新的加密 API 与 AES CBC 一起使用时 错误的缓冲区
  • 如何向 ActionBar 添加 SearchWidget?

    我正在尝试将 Search ActionView 添加到我的应用程序中 如此处所述http developer android com guide topics search search dialog html UsingSearchWi