setTextIsSelectable 如何防止键盘出现?

2024-01-17

如果我使用包含单个 EditText 的单个 Activity 创建一个简单的应用程序,并且我这样做

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

那么这会阻止键盘出现(在我对 Android 5.0 和 7.1 的测试中)。这就是我想要的,正如这些问题所要求的:

  • 从 EditText 禁用软键盘但仍允许复制/粘贴? https://stackoverflow.com/questions/15174606/disable-soft-keyboard-from-edittext-but-still-allow-copy-paste
  • 如何针对特定活动禁用 Android 软键盘? https://stackoverflow.com/questions/5851339/how-to-disable-android-soft-keyboard-for-a-particular-activity
  • Android:禁用所有 EditText 的软键盘 https://stackoverflow.com/questions/5803193/android-disable-soft-keyboard-at-all-edittexts
  • 如何在编辑文本时禁用键盘弹出窗口? https://stackoverflow.com/questions/10611833/how-to-disable-keypad-popup-when-on-edittext
  • 在 EditText 上禁用键盘 https://stackoverflow.com/questions/10636635/disable-keyboard-on-edittext

The 源代码 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L5607 is

public void setTextIsSelectable(boolean selectable) {
    if (!selectable && mEditor == null) return; // false is default value with no edit data

    createEditorIfNeeded();
    if (mEditor.mTextIsSelectable == selectable) return;

    mEditor.mTextIsSelectable = selectable;
    setFocusableInTouchMode(selectable);
    setFocusable(selectable);
    setClickable(selectable);
    setLongClickable(selectable);

    // mInputType should already be EditorInfo.TYPE_NULL and mInput should be null

    setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
    setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);

    // Called by setText above, but safer in case of future code changes
    mEditor.prepareCursorControllers();
}

但我不明白这会禁用输入法的出现。

调用以下方法均返回true我是否设置setTextIsSelectable or not.

editText.isFocusable();             // true
editText.isFocusableInTouchMode();  // true
editText.isClickable();             // true
editText.isLongClickable();         // true

我问这个问题的部分原因是我很好奇,但也因为我需要在我的应用程序中禁用系统键盘。我想了解正在发生的事情,以便我可以确定它确实在做我认为它正在做的事情。

Update

后续问题及解答:

  • 如何在使用 setTextIsSelectable 禁用触摸键盘后启用键盘 https://stackoverflow.com/questions/45228531/how-to-enable-keyboard-on-touch-after-disabling-it-with-settextisselectable

拨打电话时不显示键盘TextView.setTextIsSelectable(true)然后选择文本作为结果Editor.startSelectionActionModeInternal https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Editor.java#L2009,它检查是否TextView.isTextSelectable is false在显示文本选择之前ActionMode.

    final boolean selectionStarted = mTextActionMode != null;
    if (selectionStarted && !mTextView.isTextSelectable() && mShowSoftInputOnFocus) {
        // Show the IME to be able to replace text, except when selecting non editable text.
        final InputMethodManager imm = InputMethodManager.peekInstance();
        if (imm != null) {
            imm.showSoftInput(mTextView, 0, null);
        }
    }

我猜测为什么以这种方式实现可能是因为框架团队决定他们想要文本Editor可以预测可以选择不因键盘移动屏幕而在屏幕上跳跃。这可能只是 UI 的决定。根据 git 的说法,自 2012 年以来一直如此,但提交没有提及任何具体与该实现相关的内容。

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

setTextIsSelectable 如何防止键盘出现? 的相关文章

  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • sinon 存根不替换函数

    我正在尝试使用 sinon 存根来替换可能需要很长时间的函数 但是当我运行测试时 测试代码似乎没有使用 sinon 存根 这是我要测试的代码 function takeTooLong return returnSomething funct
  • ORM UniqueConstraint,空值重复

    我有一个对 3 个字段具有唯一约束的实体 2 个字段不可为空 第三个字段可为空 我的问题是 当第三个字段为空时 唯一约束不起作用 因此我可以在数据库中包含一些重复的值 例如 5 1 null 5 1 null 为我 5 1 null 是一个
  • Drupal 6 到 7 迁移

    我们有一个用 drupal 6 编写的 drupal 站点 我们知道我们必须为 drupal 7 重写它 大部分 但最重要的部分是迁移数据 CCK migrate 只能迁移大约 90 的田地 我正在寻找一种干净的方法将 drupal 6 数
  • 如何在 Angular 的构造函数中使用 @Inject 文本测试组件

    Angular 6 我在组件的构造函数中声明了一些注入的变量 但是当我运行时 我不知道如何在单元测试文件中配置注入的值ng test它给出了以下错误 错误 StaticInjectorError DynamicTestModule 标题 S
  • 如何更改代码中 Xaml 资源中的颜色定义 (UWP)

    UWP 我有许多带有来自 App xaml 的颜色绑定的网格 主页 xaml
  • 错误:未找到:'dart:ui' import 'dart:ui' show lerpDouble;

    块引用 错误 未找到 dart ui 导入 dart ui 显示 lerpDouble 使用 F5 来运行代码 而不是 运行代码 按钮 右上角的三角形图标 因为 vscode 将运行您当前正在使用的文件而不是整个项目
  • 2 个日期值之间的随机时间和日期

    我正在尝试编写一个 php 脚本 或代码行 来回显两个日期之间的随机时间和日期 例如 2012 12 24 13 03 这将是我选择的日期2012年10月1日和2013年1月1日之间 有什么想法如何最好地做到这一点 提前致谢 简单 只需选择
  • 如何在 Angular/TypeScript 中组合两个 URLSearchParam?

    我有两个URLSearchParams物体 我想将这两个物体结合起来制作第三个 例如 我可以有 let params1 new URLSearchParams params1 set page one params1 set size hu
  • 将 Logstash json 消息分解为字段

    它有一个日志文件 用于存储带有时间戳和 json 消息的事件 例如 时间戳 foo 12 bar 13 我想将 json 部分中的键 foo 和 bar 分解为 Logstash 输出中的字段 我知道我可以将 Logstash 文件过滤器中
  • VS Code Python 中的“启动 Jupyter 服务器”

    我已经安装了带有 Python 扩展的 VS Code 我已经使用 Anaconda 发行版创建了一些 conda 环境 当我以交互模式运行任何 python 代码时 在下面的部分中显示 正在启动 jupyter 服务器 并且代码继续运行
  • 使用一个查询从 mysql 表创建带有 rowspan 的 html 表?

    我有个问题 假设我有一个具有以下结构的关系表 ClientInvoices id id client id invoice 1 1 1 2 1 2 3 2 3 4 3 4 5 1 5 您可以看到客户 1 有 3 张发票 每个客户可以有多个发
  • 在 SQLite.cs 中找不到类型或命名空间“Sqlite”

    我有一个使用 SQLite 的 Windows Phone 8 应用程序 该应用程序具有许多数据库功能 并包括一个 sqlite 数据库文件 该文件在运行应用程序时被复制到本地文件夹并进行访问 所有这些都没有问题 直到我第一次切换到发布版本
  • 无法使用带有 python 的 selenium 通过 sendkeys 将文件上传到 iframe 内的按钮元素

    环境 Python Selenium 我正在尝试将本地文件上传到上传文件按钮 首先 我尝试查看是否可以找到该元素并单击该按钮 我通过使用成功了 driver switch to frame upload frame driver find
  • 在 C++ 中声明基于函数参数的本地数组是合法的

    我从一本书中读到 以下 C 代码不应编译 void f int n int m int a n b n m 因为数组的大小不是在编译时确定的 但我尝试了一下 发现无论是全局函数还是成员函数 使用g 都可以编译成功 这在最近的 C 实现中是合
  • 如何从Java代码生成UML图(尤其是序列图)?

    如何从现有的 Java 代码生成 UML 图 尤其是序列图 ObjectAid UML 资源管理器 http www objectaid com home 是我用过的 这很容易已安装 https www objectaid com inst
  • C# 线程池限制线程数

    好吧 我已经对该网站进行了公平的搜索 并阅读了许多有关该主题的帖子 我发现这个问题 C 中的简单线程池代码 https stackoverflow com questions 435668 code for a simple thread
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • SCONS 运行目标

    我一直在寻找 寻找 但找不到我的问题的答案 我今晚刚刚开始学习 scons 看起来棒极了 不过我遇到了一点困惑 为了便于开发 我经常喜欢让我的 make 文件构建我的目标 然后运行它 以便我可以通过一次按键来测试更改 这在 make 文件中
  • Qt,没有这样的槽

    为什么我会得到这个 Object connect No such slot Ide on action Exit triggered index Object connect sender name actionClose Project
  • setTextIsSelectable 如何防止键盘出现?

    如果我使用包含单个 EditText 的单个 Activity 创建一个简单的应用程序 并且我这样做 EditText editText EditText findViewById R id editText editText setTex