为啥我的 Button 文本在 Lollipop 上强制全部大写?

Posted

技术标签:

【中文标题】为啥我的 Button 文本在 Lollipop 上强制全部大写?【英文标题】:Why is my Button text forced to ALL CAPS on Lollipop?为什么我的 Button 文本在 Lollipop 上强制全部大写? 【发布时间】:2015-01-13 13:14:04 【问题描述】:

在我的应用 “Tide Now WA” 中,我最近使用它测试了兼容性 新的 Nexus 9 平板电脑(Lollipop - API 21)。

它会写一些按钮文本。此应用程序使用 android 2.3 和 Android 正确写入文本 4.0。 IE。混合大写和小写字母。

当我的 Nexus 9 上运行相同的应用程序时,所有字母 文中大写。

FWIW 我的清单包含以下语句:

uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14"

我可以在我的代码中修复这个问题还是操作系统中的错误? 谢谢

【问题讨论】:

你能分享一下你是如何混合大写和小写字母的代码 它们在我的 strings.xml 中定义,例如 Seattle 是的。 21. 打字太早了。对不起 在使用 Material(或 API 21+ 的 DeviceDefault)主题时,按钮文本默认为全大写。这按预期工作。 非常有用的问题。谢谢 【参考方案1】:

我不知道为什么会这样,但有 3 次微不足道的尝试:

    在您的layout-v21 中使用android:textAllCaps="false"

    以编程方式更改按钮的转换方法。 mButton.setTransformationMethod(null);

    检查你的全大写风格

注意public void setAllCaps(boolean allCaps)android:textAllCaps 是 API 版本 14 中的 available。

【讨论】:

#1 没有区别。不知道怎么做#3,没有样式?现在尝试#2。 是的,添加这个:btn[i].setTransformationMethod(null);让它工作谢谢 我接受 Nikola 的回答作为解决方案,但想指出问题的另一部分是由 alanv 提供的,他在上面的 cmets 中解释了原因。 也为我工作,使用编程方法,因为 textAllCaps XML attr 仅支持 API > 14。谢谢! 我在样式定义中使用了<item name="android:textAllCaps">false</item>【参考方案2】:

这是我在 values/themes.xml 中所做的

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="buttonStyle">@style/MyButton</item>
    </style>

    <style name="MyButton" parent="Widget.AppCompat.Button">
        <item name="android:textAllCaps">false</item>
    </style>

【讨论】:

对于 pre-API Level 14 支持,您可以使用&lt;item name="textAllCaps"&gt;false&lt;/item&gt; 这仅适用于 Widget.AppCompat.Button。下面的 Ashish Chaugule 给出了更一般的答案,即直接将 false 添加到主题样式中。 (虽然这些问题最初是专门针对按钮提出的,但我认为如果按钮不需要 allCaps,菜单项、操作等也不需要。) 对我不起作用。当我将buttonStyle更改为android:buttonStyle时开始工作 在 XML android:textAllCaps="false" 中(我使用的是 android studio 3.0)【参考方案3】:

这可以通过设置按钮的 TransformationMethod 在应用程序代码中修复,例如

mButton.setTransformationMethod(null);

【讨论】:

对于 Kotlin,语法是:mButton.transformationMethod = null【参考方案4】:

设置 android:textAllCaps="false"。如果您使用的是 appcompat 样式,请确保 textAllCaps 位于样式之前。否则样式将覆盖它。例如:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"

【讨论】:

工作就像一个魅力,但在我的情况下,我不得不这样做: 【参考方案5】:

在样式中添加这一行

    <item name="android:textAllCaps">false</item>

【讨论】:

我不知道他们为什么将其设为默认值 这是材料主题的默认设置,因为它适合材料设计的性质 可怜的人被卡在材料设计的方盒子里【参考方案6】:

这个正在工作....只需在底部代码中的代码中添加这个:

android:textAllCaps="false"

它应该停用 U 尝试输入 small 的大写字母。

【讨论】:

【参考方案7】:

棒棒糖默认自带“textAllCaps true”,所以你必须手动设置为false

【讨论】:

很高兴知道。如果有一个网站列出了每个 android 版本的所有这些默认值?【参考方案8】:

在你的 xml 中使用这一行 android:textAllCaps="false"

<Button
            android:id="@+id/btn_login"
            android:layout_
            android:layout_
            android:text="@string/login_str"
            android:background="@color/colorBlue"
            android:textColor="@color/colorWhite"
            android:textAllCaps="false"
           />

【讨论】:

非常有用的答案。谢谢【参考方案9】:

&lt;Button&gt; 标签中添加 android:textAllCaps="false" 就可以了。

【讨论】:

【参考方案10】:

有一种更简单的方法适用于所有按钮,只需更改主题中按钮的外观,试试这个:

values-21/styles.xml

<resources>
    <style name="myBaseTheme"
        parent="@android:style/Theme.Material.Light">
        <item name="android:colorPrimary">@color/bg</item>
        <item name="android:colorPrimaryDark">@color/bg_p</item>
        <item name="android:textAppearanceButton">@style/textAppearanceButton</item>
    </style>

    <style name="textAppearanceButton" parent="@android:style/TextAppearance.Material.Widget.Button">
        <item name="android:textAllCaps">false</item>
    </style>
</resources>

PS:建议遵循 Material Design 的原则,Buttons 中应显示大写文字,http://www.google.com/design/spec/components/buttons.html

【讨论】:

我同意,遵循设计指南非常好......直到按钮文本不再适合按钮 google 应该停止谈论样式 - 我不知道街上有人因为小写按钮而哭泣和抽泣!【参考方案11】:

Java:

yourButton.setAllCaps(false);

科特林:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

样式:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="buttonStyle">@style/yourButtonStyle</item>
    </style>

    <style name="yourButtonStyle" parent="Widget.AppCompat.Button">
        <item name="android:textAllCaps">false</item>
    </style>

在布局中:

   <Button
      .
      .
      style="@style/yourButtonStyle"
      .
      .
   />

【讨论】:

【参考方案12】:

您可以在按钮上添加android:textAllCaps="false"

按钮文本可能会被应用到所有按钮的应用主题转换为大写。检查主题/样式文件以设置属性android:textAllCaps

【讨论】:

【参考方案13】:

在 XML 布局中使用 android.support.v7.widget.AppCompatButton 将使您避免必须使用 layout-21 或以编程方式更改任何内容。当然,这也适用于 AppCompat v7 库。

<android.support.v7.widget.AppCompatButton
    android:id="@+id/btnOpenMainDemo"
    android:textAllCaps="false"
    style="@style/HGButton"
    android:layout_
    android:layout_
    android:text="@string/btn_main_demo"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"/>

希望这会有所帮助。

【讨论】:

【参考方案14】:

在 Android Studio IDE 中,您必须单击过滤器图标才能显示专家属性。然后您将看到textAllCaps 属性。选中它,然后取消选中它。

【讨论】:

【参考方案15】:

如果您到达这里是因为您的 facebook 按钮文本全部大写,那么只需在您的 xml 文件中添加此 android:textAllCaps="false"。它对我有用。

【讨论】:

【参考方案16】:

好的,刚刚遇到这个。 Lollipop 中的按钮全部大写,字体重置为“正常”。但在我的情况下(Android 5.02),它可以在一种布局中正确工作,但不能在另一种布局中正常工作!?更改 API 不起作用。设置为全部大写需要最小 API 14,字体仍会重置到“正常”。这是因为如果没有定义一个样式,Android Material Styles 会强制更改样式(这就是为什么它在我的一个布局中起作用,而在另一个布局中不起作用,因为我定义了一种样式) . 因此,简单的解决方法是在清单中为每个活动定义一个样式,在我的例子中,它只是: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" (希望这对某人有所帮助,昨晚会为我节省几个小时)

【讨论】:

这是一个非常糟糕的尝试,只需为您的按钮创建样式,在 values-21 中设置 allCaps 为 false 的样式。回退到旧的主题(这里是 Holo 主题)会使您的应用更丑陋,对用户来说更不一致。【参考方案17】:

如果你使用appcompat-v7,你可以继承AppCompatButtonsetSupportAllCaps(false),然后为你的所有按钮使用这个类。

/**
 * Light extension of @link AppCompatButton that overrides ALL CAPS transformation
 */
public class Button extends AppCompatButton 
    public Button(Context context, AttributeSet attrs) 
        super(context, attrs);
        setSupportAllCaps(false);
    

    public Button(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
        setSupportAllCaps(false);
    

请参阅AppCompatButton#setSupportAllCaps(boolean) Android 文档。

【讨论】:

【参考方案18】:

默认情况下,android 中的 Button 提供 all caps 关键字。如果您希望按钮文本为小写或混合大小写,您可以使用 android:textAllCaps="false" 禁用 textAllCaps 标志

【讨论】:

【参考方案19】:

我不知道为什么@user1010160 的答案评分为 0。如果我有足够的声望,我会给它 +1。

由于我的应用程序是为小于 14 的 API 设计的,并且我不想在我的程序中添加代码,所以在阅读他的回答之前我没有找到解决方案。他说的是,即使您已经完成了应用程序样式中所需的操作,除非您在活动中添加样式并将 textAllCaps 设置为 false,否则它将无法正常工作。

仅有 Activity 的样式是不够的(我的 Activity 有样式),因为该样式可能默认为 AllCaps 属性。您还必须在活动中明确设置该属性为 false。

我现在在应用程序和清单文件的活动部分都有它。

【讨论】:

【参考方案20】:

另一个程序化 Kotlin 替代方案:

mButton.transformationMethod = null

【讨论】:

以上是关于为啥我的 Button 文本在 Lollipop 上强制全部大写?的主要内容,如果未能解决你的问题,请参考以下文章

我的 Material Design ActionBar 或 Lollipop 设备中的 StatusBar 上没有显示颜色,但在 Pre-Lollipop 设备的 ActionBar 中显示。为啥?

Lollipop 上的 Android Button Ripple 和 pre lollipop 上的高亮显示

Lollipop 在我的应用程序中将按钮的文本大写

DVM 和 ART 有啥区别?为啥在 Lollipop 中 DVM 已正式被 ART 取代?

为啥 button.click() 在我的脚本中不起作用?

使用Material Design在Android Lollipop中的ListView中的活动过渡动画