可滚动 TextView 不允许在应用程序暂停后选择文本

2024-01-07

我有一个可滚动的TextView用户可以在其中选择文本。我通过将移动方法设置为来添加滚动条ScrollingMovementMethod.

Problem:除非应用程序暂停(例如,切换应用程序后),否则选择效果很好。一旦应用程序再次处于活动状态,选择就会停止工作,我会在日志中收到以下消息:

W/TextView:TextView不支持文本选择。选择 取消。

我的设置:

我有一个活动CoordinatorLayout和一个带有TextView包裹成RelativeLayout看起来像这样:

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:scrollbars="vertical" />

在 Java 代码中我必须这样做:

textView.setMovementMethod(new ScrollingMovementMethod());
textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

因为根据规定,这是唯一的工作方式this https://stackoverflow.com/q/15857755/2065796, this https://stackoverflow.com/q/37566303/2065796 and this https://issuetracker.google.com/issues/37095917 issues.

EDIT:

问题出在下面的调用中

textView.setMovementMethod(new ScrollingMovementMethod());

如果我删除它,它会起作用,但我不明白为什么。

重现该问题的最少步骤:

1)创建一个空的ActivityTextView使用以下布局。

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:text="Some very very very long text..."
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:scrollbars="vertical" />

</android.support.design.widget.CoordinatorLayout>

2)设置可见性参数TextView in onStart()方法。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        TextView textView = findViewById(R.id.text_view);
        textView.setMovementMethod(new ScrollingMovementMethod());
        textView.setTextIsSelectable(true);
        textView.setFocusable(true);
        textView.setFocusableInTouchMode(true);
    }
}

3)尝试使用上下文菜单TextView暂停应用程序之前和之后。

EDIT 2:

去除setMovementMethod(new ScrollingMovementMethod())解决了我的问题,之后功能运行良好。但我不太清楚为什么要添加它,而且我担心如果删除它,它会破坏某些东西。知道为什么有人会使用ScrollingMovementMethod结合android:scrollbars="vertical"。也许 xml 在某些情况下不起作用?有想法吗?我仍然感兴趣为什么使用ScrollingMovementMethod刹车选择功能?


请替换您的 XML 中的以下代码。

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" 
    android:scrollbars="vertical" />

从程序中删除以下代码:

textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

内部代码为setTextIsSelectable() method:

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(FOCUSABLE_AUTO);
        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();
    }

从编程上来说,它们也在做我在 XML 中提到的同样的事情。因此,根据您的要求,我们可以使用它。

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

可滚动 TextView 不允许在应用程序暂停后选择文本 的相关文章

随机推荐

  • 如何将库添加到 xcode [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这个问题已经被问过很多次了 但我总是
  • OpenLayers 动画 getView().fit()

    我一直在研究 openlayers 的动画功能 我可以看到使用缩放到给定点和分辨率是多么简单 view animate center position zoom 11 但我不知道如何制作动画 map getView fit extent m
  • 通过 AWS ECS 在一个 EC2 实例中使用多个 docker 容器

    是否可以通过AWS ECS EC2容器服务 在一个EC2实例中运行多个docker容器 Yes AWS 文档 产品细节从未明确提及 但它谈到了向集群启动许多容器 一个集群可以是一个实例 配置容器时 https docs aws amazon
  • Vista 中 CEdit 中的 SetLimitText() 不起作用

    Vista 上就发生了这种情况 我创建了一个新的基于对话框的 MFC 项目来测试这一点 我在对话框中添加了一个 CEdit 控件 我调用 SetLimitText 让我的 CEdit 接收 100000 个字符 我都尝试过 this gt
  • 如何用Java编写“所有这些数字都不同”的条件?

    好的 我有这个问题要解决 但我无法正确地用 Java 编程 看下图 你会看到一个 6 角星 每个点和线的交点都是一个字母 作业是将数字 1 到 12 的位置设置为使得四个球的所有线的总和为 26 并且星形的所有 6 个点的总和也为 26 这
  • 使用 mod_rewrite 从 url 中删除两个子目录

    我正在尝试删除网站上的一些子目录 目前 当我需要访问用户设置时 我使用这个username mywebsite com public user settings php我希望它看起来像username mywebsite com setti
  • 来自具有不同长度的列表列表的 NumPy 数组(填充)[重复]

    这个问题在这里已经有答案了 我有一个这样的列表 lista 1 2 3 1 2 3 4 5 6 1 2 我想得到像这样的 numpy array 较短的列表元素扩展到最大长度 然后将尾部值设置为零 array 1 2 3 0 0 0 1 2
  • 在 Brunch 应用程序中使用 npm 模块会导致“找不到模块”

    我想使用这个节点库 https github com sudhirj simply deferred https github com sudhirj simply deferred I ran npm install simply def
  • ios7取消3次后无法登录游戏中心增益[重复]

    这个问题在这里已经有答案了 问题很奇怪 我的系统版本是IOS 7 在ios 7模拟器上一切正常 但是 当我尝试在 iPhone 上进行身份验证时 回调块中的错误始终是 GkErrorCanceled the requested operat
  • Objective C - 如何连接整个字符串数组?

    我是 Objective C 新手 我想编写一个方法 它接受一个字符串数组并返回一个连接字符串 每个字符串之间有一个逗号 所以如果一个数组是 a b c d 我想返回a b c d 最简单的方法是什么 方法有很多种 最简单的就是 yourA
  • 如何在Python脚本中设置PATH=%PATH%作为环境?

    我正在尝试从Python程序启动一个exe文件 该exe文件是使用Visual Studio编译的C 项目的输出 在此 c 项目的属性中 配置 gt 属性 gt 调试 gt 环境 中的以下设置 PATH PATH lib testfolde
  • 与库版本相关的 TypeScript @types 版本

    谁能解释一下 TypeScript types 背后的版本控制https github com DefinitelyTyped DefinitelyTyped https github com DefinitelyTyped Definit
  • 像 Facebook 一样从任何 URL 获取特定图像

    My Question might be looks like similar to other questions but really this is not according to my knowledge i can t unde
  • 开发算法的人和开发人员之间最有效的工作流程是什么?

    我们正在开发具有视频模式识别功能的软件 我们有 7 位数学家正在创建算法 另外 我们有 2 名开发人员使用这些算法维护 开发应用程序 问题在于数学家使用不同的开发工具来创建算法 例如 Matlab C C 另外 因为他们不是开发人员 所以不
  • Android 在单击按钮时返回到第一个 Activity

    我正在编写一个应用程序 其中处理 4 个活动 比方说 A B C 和 D 活动 A 调用 B B 调用 C C 调用 D 在每个活动上 我都有一个名为 home 的按钮按钮 当用户单击任何 B C D 活动中的主页按钮时 应用程序应该返回到
  • 如何创建列表的 numpy 数组?

    我想创建一个 numpy 数组 其中每个元素都必须是一个列表 因此稍后我可以向每个元素附加新元素 我已经在谷歌和堆栈溢出上查看过 但似乎无处可寻 主要问题是 numpy 假设你的列表必须成为一个数组 但这不是我想要的 正如你发现的那样 np
  • 如何从 ngGrid 中显示的按钮调用作用域方法 - 在 Angular js 中

    angular module harbinger controller Admin UserlistController function rootScope scope location http userService etc scop
  • 使用 Dagger 2 进行 Presenter 注入

    我刚刚开始使用 Dagger 2 我在网上发现了数千个指南 每个指南都有不同的实现 我现在有点困惑 所以基本上这就是我现在写的 应用程序模块 java Module public class AppModule Application mA
  • 如何获取属于自定义属性的属性?

    我需要从自定义属性中查找应用自定义属性的属性的类型 例如 MyAttribute string MyProperty get set 给定 MyAttribute 实例 我如何获取 MyProperty 的类型描述符 换句话说 我正在寻找
  • 可滚动 TextView 不允许在应用程序暂停后选择文本

    我有一个可滚动的TextView用户可以在其中选择文本 我通过将移动方法设置为来添加滚动条ScrollingMovementMethod Problem 除非应用程序暂停 例如 切换应用程序后 否则选择效果很好 一旦应用程序再次处于活动状态