输入连接-如何删除选定的文本?

2024-06-19

我为 Android 制作了一个自定义键盘。当我按下键盘的退格按钮时,我使用

getCurrentInputConnection().deleteSurroundingText(1, 0);

从输入字段中删除一个字母。但是,当我选择一些文本然后按退格按钮时,所选文本不会被删除。我应该在输入连接中使用什么方法,以便在按下退格按钮时也从键盘中删除所选文本?


删除时需要考虑以下情况:

  • 有一个作曲选择。
  • 编辑者/用户在文本上有光标选择。
  • 没有任何类型的选择。

如果有选择,则应将其删除。如果没有选择,则应删除光标前面的字符。

解决方案1

起初我用的是这个方法。我喜欢它,因为它只使用输入连接。

CharSequence selectedText = inputConnection.getSelectedText(0);
if (TextUtils.isEmpty(selectedText)) {
    // no selection, so delete previous character
    inputConnection.deleteSurroundingText(1, 0);
} else {
    // delete the selection
    inputConnection.commitText("", 1);
}

只要输入连接使用默认的BaseInputConnection.deleteSurroundingText https://android.googlesource.com/platform/frameworks/base/+/56a2301/core/java/android/view/inputmethod/BaseInputConnection.java#207方法,这个应该没问题。然而,应该指出的是,文档 https://android.googlesource.com/platform/frameworks/base/+/56a2301/core/java/android/view/inputmethod/BaseInputConnection.java#207 warns

输入法作者:请注意不要只删除代理的一半 一对。另请注意,删除的字符数不要超过 编辑器,因为这可能会对应用程序产生不良影响。

如果某些自定义视图使用的输入连接无法正确检查文本长度或代理对,则可能会导致崩溃。尽管这不太可能发生,但如果您使用此解决方案,那么您应该在此处添加额外的检查代码。

这可能就是为什么Android 键盘示例 https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java#582首先检查是否存在组合跨度,如果不存在则使用以下解决方案。

解决方案2

您还可以使用输入连接发送KeyEvent with KEYCODE_DEL。在我看来,这不太好,因为它是一个伪装成硬键盘的软键盘。但很多键盘都是这样做的。当我在制作一个接受键盘输入的自定义视图 https://stackoverflow.com/a/44342915/3681880,我必须将删除作为KeyEvent,即独立于输入连接(因为输入连接没有删除文本)。

所以只需将删除消息作为KeyEvent(就像您按下硬键盘键然后松开一样)。

getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DEL));
getCurrentInputConnection().sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_DEL));

这按预期工作。如果有选择,则删除该选择;如果没有选择,则删除光标后面的一个字符。 (但是,您应该单独处理任何组合跨度。)

谢谢这个答案 https://stackoverflow.com/a/40749965/3681880为了这个想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入连接-如何删除选定的文本? 的相关文章

  • 如何更改Android Studio中的编译版本?

    我总是使用 eclipse 来构建 android 项目 当我使用eclipse启动一个新项目时 我可以选择编译版本 但是在Android Studio中 当我启动新模块时 我只能选择最小版本 我试图改变compileSdkVersion
  • 离线安装 android 很困难[已过时]

    我是非洲的一名学生 在我们的土地上 实际上存在缓慢且昂贵的互联网连接 这就是为什么每当我们听到 在线存储库 安装软件方法这个词时我们都会感到恐惧 该死 这通常意味着你必须去别处寻找 问题 如果没有将 Eclipse 连接到互联网 我无法安装
  • Intent.putExtra列表[重复]

    这个问题在这里已经有答案了 可能的重复 如何将列表放入意图中 https stackoverflow com questions 6541088 how to put a list in intent 我想通过一个List从一项活动转移到另
  • Android 使用键盘上的“完成”按钮来单击按钮

    好的 在我的应用程序中 我有一个供用户输入数字的字段 我已将该字段设置为仅接受数字 当用户单击该字段时 它会弹出键盘 键盘 ICS 上 上有一个完成按钮 我希望键盘上的完成按钮能够触发我的应用程序中的提交按钮 我的代码如下 package
  • 如何编写带有回调的简单react-native本机模块

    如何以最简单的方式完成这项工作 我无法将回调发送到react native 可能我错过了一些东西 ReactMethod public void testCallback Callback cb String sampleText Java
  • 如何设置 MediaCodec 创建的编码器缓冲区大小

    我正在尝试使用 Nexus 来测试 Mediacodec API 的编码 我可以看到编码器提供的inputBuffers是119040 通过记录inputBuffers capacity 但帧的大小 即输入 是 460800 我收到错误消息
  • 如何在 Kotlin 中获取可绘制对象?

    I am working on a small project in Android Studio I have drawable added to res drawable folder 但是我无法从代码中获取它 我尝试过不同的方法 Co
  • 更改Android TabWidget底部栏颜色

    如何更改 TabWidget 底部栏的颜色 我已经成功更改了选项卡背景颜色 但底部栏仍然是灰色 橙色 并且我在 Android 文档和源代码中找不到与此相关的任何信息 谢谢 See 启用 禁用此行 tabHost getTabWidget
  • Jetpack Compose 预览未显示

    我似乎在撰写预览时遇到问题 当我使用 preview 注释撰写方法时 布局面板不会出现 我假设我缺少依赖项 但我已从此处复制并粘贴了代码https developer android com jetpack compose setup ht
  • OpenGL ES 2.0 只绘制一次对象

    首先我要说的是 很抱歉今天问了这么多问题 所以 我有一个圈子的课程 我有一个包含 3 个圆形实例的数组列表 每个实例都有不同的 x 坐标来绘制 不管出于什么原因 OpenGL ES 2 0 只绘制其中之一 尽管我调用所有这些来绘制 我检查了
  • Geo Fix 在 Android SDK 2.2 中不起作用

    我正在尝试测试 Android 应用程序 我需要发送模拟位置来测试这一点 我已经注册了 requestlocation update 方法 如下 locationManager requestLocationUpdates bestProv
  • W/Firestore:[CustomClassMapper]:Android 类没有设置器/字段

    我试图使用 Recyclerview 从 Documents 类加载数据 但 logcat 上出现错误 W Firestore 21 1 1 CustomClassMapper No setter field for Document Na
  • 如何将 VectorDrawable 与 Android 工具栏一起使用?

    在工具栏中使用新的 VectorDrawable 的正确方法是什么 我尝试使用app srcCompat元素如下图所示 但没有任何显示 menu menu
  • 发布 apk 中的“来源不明”

    我的调试 APK 中的所有内容都运行良好 但是 当我导出 APK 并安装它时 一切正常 直到我调用引用的库 E AndroidRuntime 32571 at com znood znoodapp ShowResultsActivity a
  • 我可以通过编程方式选择 Android 布局文件夹吗?

    我正在构建一个 Android 应用程序 它使用不同的布局文件夹 即 Large xlarge 等 根据屏幕尺寸调整大小 唯一的问题是 我想为用户提供一种在小屏幕布局和大屏幕布局之间切换的方法 以防他们拥有无法识别 xlarge 标签的前蜂
  • 如何将相机居中以使标记位于屏幕底部? (谷歌地图API V2 Android)

    单击标记时 相机的默认行为是将其置于屏幕中央 但由于我通常在信息窗口中有很长的文本描述 因此实际更改相机位置以使标记位于屏幕的底部会更方便 屏幕 使信息窗口位于屏幕中央 我认为我应该能够通过重写 onMarkerClick 函数来做到这一点
  • 带图标的 Android ContextMenu 选项

    Hi All 我有一个简单的问题 是否可以将带有图标的菜单项添加到上下文菜单中 我搜索过这个问题 发现这是不可能的 但是在 Android 设备的主屏幕中 当我长按时 会显示 添加到主屏幕 上下文菜单 其中包含带有文本的菜单项和图标 所以我
  • 更新 android chrome 版本 65 后,应用程序无法运行,Sencha touch 和 cordova android

    更新 chrome 版本 65 后 应用程序在点击某些点击事件时再次显示启动屏幕 它是 Sencha touch 和 Cordova android 的混合应用程序 编辑 这是一个已知的 chrome 65 错误 https bugs ch
  • .so 文件的 objdump?需要帮助来理解消息

    我正在开发一个与流相关的本机应用程序 我在我的 c 模块中遇到了一些问题 我收到的是来自 Logcat 的一些消息 这是 Logcat 消息 INFO DEBUG 28 Build fingerprint generic sdk gener
  • 如何在 Android 中没有视频视图的情况下从 URL 获取视频长度(以毫秒为单位)?

    我正在 Android 中制作一个媒体播放器 我需要一个代码来获取视频长度而不使用视频视图 我在堆栈溢出中看到了很多页面 但每个页面都用于显示如何在视频视图中获取视频的长度 但我需要没有视频视图 你可以使用媒体元数据检索器 http dev

随机推荐

  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 在 Swift 中对约束进行动画处理

    我有一个UITextField我想在点击时放大它的宽度 我设置了约束 并确保左侧约束的优先级低于我尝试在右侧设置动画的约束 这是我尝试使用的代码 move the input box UIView animateWithDuration 1
  • 我在哪里可以找到高级backbone.js示例[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有人可以指导我找到包含高级backb
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • Emacs htmlize 在批处理模式下?

    我喜欢在 emacs 中使用 htmlize file 将 clojure 源文件转换为 html 我想从 linux 命令行使用它 或者从 clojure 本身以编程方式使用它 I tried emacs eval htmlize fil
  • VS Code 在交互式变基期间不会等待我 [重复]

    这个问题在这里已经有答案了 如果我使用交互式变基git rebase i使用为 Git 配置的默认编辑器 一切都运行良好 如果我在我的全局中添加以下内容 gitconfig core editor C Program Files x86 M
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • 在 Marshmallow 中获取蓝牙本地 mac 地址

    在 Marshmallow 之前 我的应用程序将通过以下方式获取其设备 MAC 地址BluetoothAdapter getDefaultAdapter getAddress 现在 随着 Marshmallow Android 的回归02
  • 更快的算法来计算有多少数字可以被范围内的特定整数整除

    int a b c d 0 cin gt gt a gt gt b gt gt c for int i a i lt b i if i c 0 d cout lt
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • 为什么在尝试编译此代码时会收到错误“错误:未知类型名称'虚拟'”?

    Code struct IRenderingEngine virtual void Initialize int width int height 0 virtual void Render const 0 virtual void Upd
  • 在 Visual Studio 中继承构建后事件?

    我在 Visual Studio 中有一个解决方案 其中有一个共享属性表 其中包含构建后事件命令 bar 需要为每个项目执行 Foo props gt 通用属性 gt 构建事件 gt 构建后事件 gt 命令行 栏 然后 我如何指定其他特定于
  • jquery ajax调用一个接一个循环而不停止页面渲染

    我有一个超过 100 行的表 每行包含 pdf 文件及其说明以及最后一列状态 状态显示 pdf 文件是否可读 一旦表格加载到浏览器中 我就会从表格的每一行获取每个文件名 并使用 ajax 调用对其进行处理 如果文件可读 我将该行的状态字段更
  • 带有 Play 框架的 cassandra

    我正在尝试开发一个由两部分组成的应用程序 Web 服务和 Android 应用程序 我计划使用 java play 框架和 cassandra noSQL 数据库来实现我的 Web 服务 我已经找了两天了 我还是不知道该怎么做 我需要集成一
  • 如何使用 Spring Boot 和 Flyway 设置 Quartz 调度程序的数据库架构?

    我有一个 Spring Boot 应用程序 它使用 Quartz 调度程序和 PostGreSQL 数据库作为存储 我正在将它从使用它自己的数据库运行迁移到publicschema 来针对每个应用程序使用一个 schema 的共享数据库运行
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • RSpec 2 中使用 OR 相等

    下面这个例子的正确写法是什么 玩家的分数应等于 5 或 8 it should equal 5 or 8 do player score should 5 or 8 end Thanks Tim 5 or 8将始终产生结果 5 并且不会执行
  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格