android - 长按 Material Design 按钮允许粘贴到按钮标签中

标签 android material-design android-appcompat

背景

我有一个标准的 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 的角度来看,我看不出有什么方法可以阻止这种情况,但感觉这根本不可能。

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

最佳答案

看来,这种行为并不是 AppCompatButton 独有的。它源于 ButtonTextView 的子类,而在您的案例中实际触发该行为的是您自定义中的 capitalize 属性风格。当它被设置为none以外的任何值时,它会导致TextView 的内部Editor 激活并响应长时间点击。

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

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

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

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

关于android - 长按 Material Design 按钮允许粘贴到按钮标签中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37864591/

相关文章:

javascript - 特殊风格-素材图标

java - 更改 AlertDialog 按钮对齐方式

android - 无效的资源目录名称 "font"Xamarin Android

Android SQLite - openOrCreateDatabase() nullPointerException

android - 为什么 Carto Package Manager 在恢复后无法连接到它的数据库?

android - 如何在Android中获取用户设置默认键盘的ID

android - 选项卡 fragment - 选项卡随 fragment 侧面的按钮操作而变化

ios - MDCTabBar 更改字体类型和大小

android - 如何更改 Android 中 Button 中使用的 Material Design 图标的颜色

java - Android Ripple 效果在 fragment 内滞后