长按 Material Design 按钮可以将内容粘贴到按钮标签中。

4

背景

我有一个标准的Material Design按钮,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.AppCompatButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/medium_margin"
    android:layout_marginRight="@dimen/medium_margin"
    android:textStyle="bold"
    tools:text="I am a Button"
    style="@style/PrimaryColoredButton" />

应用于它的样式如下所示。
<style name="PrimaryColoredButton" parent="Widget.AppCompat.Button.Colored">
    <item name="android:textColor">@color/white</item>
    <item name="android:capitalize">sentences</item>
    <item name="android:background">@drawable/primary_button_background</item>
</style>
问题 当长按按钮时,系统会出现粘贴按钮,允许用户将内容粘贴到按钮标签中。 Material Button showing Paste option 然后粘贴后: enter image description here 从XML的角度来看,我无法找到停止这种情况的方法,但感觉这根本不应该是可能的。
有趣的是,只有在长按背景而不是文本时才会发生这种情况。
1个回答

3
那种行为似乎不仅限于 AppCompatButton。它源于 Button 是 TextView 的子类,而在你的自定义样式中实际触发该行为的是 capitalize 属性。当此属性设置为除 none 以外的任何值时,它会导致 TextView 内部的 Editor 激活并响应长按。
实际上,似乎任何属性设置都会导致 Button 具有与默认不同的输入类型时都会发生这种情况。这些属性包括但不限于 capitalize、digits、autoText 和任何非 none 的 inputType。textIsSelectable 属性也会造成一些混乱,因为 Button 将表现得像一个不可编辑的 EditText。光标和选择句柄将出现,并在适当时出现编辑 CAB,但没有输入法,且 Button 无法被点击。
这明显不是您通常会在 Button 上设置的属性,但对我来说这绝对是个 bug,因为 Button 可能不应以任何方式变得可编辑。确实,在某些状态下,粘贴文本,然后转移焦点或单击会导致 Editor 崩溃。如果这不是期望的行为(粘贴而不崩溃),那么就已经错误地实现了一段时间。
为解决此问题,请从样式中删除 capitalize 属性,并在设置 Button 文本时自己处理。或者,如果您不需要在 Button 上响应长按,则可以将样式中的 longClickable 属性设置为 false。
不幸的是,仅仅将 (已弃用的) editable 属性设置为 false 似乎并不能解决问题,如果与上述任何一个有问题的属性结合使用。

我真的得出了同样的结论!我在我的样式中有这一行<item name="android:capitalize">sentences</item>,它的行为与你描述的完全一样。 - Graham Smith
啊,太好了。很高兴我们确认了彼此的发现!我一直在尝试写这个问题的解决方案已经一个小时了,但是我被另一个问题的用户卡住了。这肯定是一个 bug。也许我们应该告诉有关人员? - Mike M.
当然,我没有机会彻底查看TextView的源代码(该类很大),但我相当确定我的初步诊断是正确的。 - Mike M.
1
https://code.google.com/p/android/issues/detail?id=213406&thanks=213406&ts=1466154875 - 在这里报告了一个错误,请随时提供更多信息-再次感谢! - Graham Smith
1
我不确定TextUtils中是否有任何特别有用的内容。将一个String按照必要的标点符号分割,大写每个单词的首字母,然后将结果连接起来是很容易的。可能有更快或更简单的方法。也许Apache的StringUtils有相关的函数。 - Mike M.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接