为什么我的按钮文本在Lollipop系统中被强制转换为全大写?

501
在我的应用程序“Tide Now WA”中,我最近使用新的Nexus 9平板电脑(Lollipop-API 21)测试了兼容性。
它会写入一些按钮文本。该应用程序在Android 2.3和Android 4.0上正确地编写文本,即混合大写字母和小写字母。
当在我的Nexus 9上运行同一应用程序时,文本中的所有字母都是大写的。
顺便提一下,我的清单包含以下声明: uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" 我能在我的代码中修复这个问题吗,还是这是操作系统中的一个错误?
谢谢

你能分享一段代码,展示如何混合使用大写和小写字母吗? - N Sharma
它们在我的strings.xml文件中定义,例如 <string name="r1s1">西雅图</string>。 - user1644002
还太早,打得不对。抱歉。 - user1644002
26
在使用 Material(或 API 21+ 中的 DeviceDefault)主题时,按钮文本默认为全大写。这是预期的工作方式。 - alanv
非常有用的问题。谢谢。 - Yi Xiang Chong
20个回答

21

Java:

yourButton.setAllCaps(false);

Kotlin:

->

Kotlin:

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

在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_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_main_demo"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"/>

希望这有所帮助。


12
您可以在按钮中添加android:textAllCaps="false"
您的应用程序主题可能会将所有按钮的文本转换为大写。请检查主题/样式文件以设置android:textAllCaps属性。

10

在Android Studio IDE中,您需要点击筛选器图标以显示专家属性。然后您将看到textAllCaps属性。勾选它,然后取消勾选。


6
如果您因为Facebook按钮文字全部大写而来到这里,那么只需在您的xml文件中添加android:textAllCaps="false"即可。对我来说有效。

3
好的,我遇到这个问题。 在Lollipop中,按钮都变成了大写字母,并且字体重置为“正常”。 但在我的情况下(Android 5.02),它在一个布局中正确地工作,但在另一个布局中不起作用!更改API无效。将所有大小写设置为大写需要最低API 14,而且字体仍然会重置为“正常”。

这是因为Android Material Styles(Android材料样式)强制更改样式(如果没有定义,则会更改样式)。这就是为什么在我的一个布局中可以工作而另一个布局不能工作的原因(因为我定义了一个样式)。

因此,简单的解决方法是在清单文件中为每个活动定义一个样式,我的情况下只需要:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" (希望这对某人有所帮助,昨晚已经节省了我几个小时)。

4
这是一个非常糟糕的尝试,只需为您的按钮创建样式,其中一个值为21且allCaps为false。回退到旧主题(例如Holo主题)会使您的应用程序变得更加难看且给用户带来不一致性体验。 - paulgavrikov

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);
    }
}

查看 Android 文档中的 AppCompatButton#setSupportAllCaps(boolean)

2
默认情况下,在Android中,按钮提供了全大写的关键字。如果你想要将按钮文本变成小写或混合大小写,你可以使用android:textAllCaps="false"关闭textAllCaps标志。"最初的回答"。

0

另一个编程用的 Kotlin 替代品:

mButton.transformationMethod = null


0

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

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

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

现在,在清单文件的应用程序和活动部分都已经设置好了。


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