为什么我的Button文本被迫在Lollipop上全部大写?


444

在我的应用程式“ WA即时潮汐”中我最近中使用新的Nexus 9平板电脑(Lollipop-API 21)测试了兼容性。

它写入一些按钮文本。这个应用程式可以使用Android 2.3和Android 4.0正确写入文字。即混合使用大写和小写字母。

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

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

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

我可以在我的代码中解决这个问题,还是操作系统中的错误?


您能分享一个代码,如何混合使用大写字母和小写字母吗?
Sharma N

它们在我的strings.xml中定义,例如<string name =“ r1s1”> Seattle </ string>
user1644002 2014年

是。21.为时过早,无法正确输入。抱歉
user1644002 2014年

23
使用Material(或API 21+或DeviceDefault)主题时,默认情况下,按钮文本为全大写。这按预期工作。
alanv 2014年

Answers:


632

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

  1. android:textAllCaps="false"在你的layout-v21

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

  3. 检查您的Allcaps风格

public void setAllCaps(boolean allCaps)android:textAllCaps可以从API版本14。


#1没有影响。不知道该怎么做#3,没有样式?现在尝试#2。
user1644002 2014年

2
是的,添加以下内容:btn [i] .setTransformationMethod(null); 让它工作谢谢
user1644002 2014年

2
我接受尼古拉的答案作为解决方案,但我想指出问题的另一部分是由alanv提供的,后者在上面的评论中解释了原因。
user1644002 2014年

1
也为我工作,使用了编程方法,因为textAllCaps XML attr仅受API> 14支持。谢谢!
patrickjason91 2015年

3
<item name="android:textAllCaps">false</item>在样式定义中使用过
某处某人2015年

169

这是我在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>

8
要获得API之前的14级支持,您可以使用<item name="textAllCaps">false</item>
CommonsWare,2016年

这仅适用于Widget.AppCompat.Button。下面是Ashish Chaugule给出的更一般的答案,即直接在主题样式中添加<item name =“ android:textAllCaps”> false </ item>。(尽管最初是针对按钮提出问题的,但我认为如果不希望对按钮使用allCaps,对于菜单项,操作等也不希望使用
allCaps

1
没为我工作。当我buttonStyle转到android:buttonStyle
Vasily Kabunov

2
在XML中android:textAllCaps="false"(我正在使用android studio 3.0)
meyasir

107

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

mButton.setTransformationMethod(null);

对于Kotlin,语法为:mButton.transformationMethod = null
Native_Mobile_Arch_Dev

65

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

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

像魅力一样工作,但就我而言,我必须这样做:<style name =“ textAppearanceButton” parent =“ @ android:style / TextAppearance.Material.Widget.Button”> <item name =“ android:textAllCaps”> false < / item> </ style>
Vfleitao 2015年


35

这是有效的....只是在您的代码的底部代码中添加以下代码:

android:textAllCaps="false"

应该取消U试图输入小写的大写字母。


32

棒棒糖默认带有“ textAllCaps true”,因此您必须手动将其设置为false


5
很高兴知道。是否有网站列出每个Android版本的所有这些默认值?
亚当


19

有一种更简单的方法可用于所有按钮,只需更改主题中按钮的外观,请尝试以下操作:

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>

附言:建议您遵循材料设计的原则,您应该在Buttons中以大写字母显示,http://www.google.com/design/spec/components/buttons.html


2
我同意,遵循设计指南非常好...直到按钮文本不再适合按钮为止
Somewhere Somewhere

Google应该停止谈论样式-我不知道由于小写字母的按钮,在大街上有人在哭泣和哭泣!
bharal

11

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

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

希望这可以帮助。


11

在您的xml中使用以下行android:textAllCaps =“ false”

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

9

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


9

您可以添加android:textAllCaps="false"到按钮。

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


9

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"
      .
      .
   />

4

如果您到达这里是因为您的Facebook按钮文字全部大写,则只需将其添加android:textAllCaps="false"到xml文件中即可。它为我工作。


2

好,就碰到这个 Lollipop中的按钮全部大写,并且字体重置为“正常”。但是就我而言(Android 5.02),它在一种布局中正常工作,而在另一种布局中却不行!

更改API无效。
设置为全部大写都需要至少API 14,并且字体仍会重置为“正常”。

这是因为,如果未定义Android材质样式,则会强制更改样式(这就是为什么它可以在我的一种布局中工作,而在另一种布局中却不能工作,因为我定义了一种样式)。

因此,简单的解决方法是在清单中为每个活动定义一个样式,在我的情况下,它只是:
android:theme =“ @ android:style / Theme.NoTitleBar.Fullscreen”
(希望这对某人有帮助,这样可以为我省下几分昨晚的小时数)


4
这是非常不好的尝试,只为按钮创建样式,在values-21中将allCaps设置为false。退回到较旧的主题(此处为Holo主题)会使您的应用更丑陋,并且与用户更加不一致。
bluewhile

2

如果使用appcompat-v7,则可以继承AppCompatButton和的子类setSupportAllCaps(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文档。



0

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

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.