【问题标题】:Long Press Material Design Button Allows Pasting into Button Label长按材料设计按钮允许粘贴到按钮标签
【发布时间】:2016-10-18 06:57:02
【问题描述】:

背景

我有一个标准的 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>

问题

当按钮被长按时,系统粘贴按钮出现并允许用户将内容粘贴到按钮的标签中。

然后粘贴后:

从 XML 的角度来看,我看不出有什么方法可以阻止这种情况,但感觉这根本不可能。

有趣的是,只有当长按不是在文本上而是在背景上时才会发生这种情况。

【问题讨论】:

    标签: android material-design android-appcompat


    【解决方案1】:

    这种行为似乎不是AppCompatButtons 独有的。它源于ButtonTextView 的子类这一事实,在您的情况下实际触发该行为的是您自定义样式中的capitalize 属性。当它设置为none以外的任何值时,它会导致TextView的内部Editor变为活动状态并响应长按。

    事实上,似乎任何导致Button 具有非默认输入类型的属性设置都会导致这种情况。这些属性包括——但不限于——capitalizedigitsautoText,显然,除了none 之外的任何inputTypetextIsSelectable 属性也会造成一些破坏,因为Button 将像不可编辑的EditText 一样工作。将出现光标和选择句柄,以及适当的编辑 CAB,但没有输入法,Button 变得不可点击。

    这些显然不是您通常会在Button 上设置的属性,但这对我来说绝对是一个错误,因为Button 可能无论如何都不应该让自己变得可编辑。事实上,在某些状态下,粘贴文本,然后转移焦点或单击会导致 Editor 崩溃。如果这是意外行为(粘贴,而不是崩溃),据我所知,它已经错误地实施了一段时间。

    要解决这个问题,您应该从您的样式中删除 capitalize 属性,并在您在 Button 上设置文本时自行处理。或者,如果您不需要响应长时间点击您的Buttons,您可以将样式中的longClickable 属性设置为false

    不幸的是,如果与上述任何其他有问题的属性结合使用,只需将(已弃用的)editable 属性设置为 false 似乎并不能解决问题。

    【讨论】:

    • 我确实得出了同样的结论!我的风格是&lt;item name="android:capitalize"&gt;sentences&lt;/item&gt;,它的行为与您描述的完全一样。
    • 啊,酷。很高兴我们证实了彼此的发现!我已经尝试写了一个小时,但我一直被用户困在另一个问题上。这当然看起来是一个错误。也许我们应该告诉别人?
    • 如果你想帮助协作发现,我会提交一个错误然后链接你?
    • code.google.com/p/android/issues/… - 此处提交的错误请随时提供更多信息 - 再次感谢!
    • 我不确定TextUtils 中的任何内容是否会有所帮助。在必要的标点符号上拆分String,将每个首字母大写,然后加入结果,这很容易。可能有更快或更简单的方法。也许 Apache 的 StringUtils 有一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2015-01-04
    • 2016-09-20
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多