Почему на кнопке «Текст» для кнопки «Все буквы» на Lollipop?


448

В моем приложении «Tide Now WA», которое я недавно тестировал на совместимость, использовал новый планшет Nexus 9 (Lollipop - API 21).

Это пишет некоторый текст кнопки. Это приложение правильно пишет текст, используя Android 2.3 и Android 4.0. Т.е. смешанные прописные и строчные буквы.

Когда на моем Nexus 9 запускается одно и то же приложение, все буквы в тексте пишутся с большой буквы.

FWIW мой манифест содержит следующее заявление:

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

Могу ли я исправить это в моем коде или это ошибка в ОС, спасибо


Можете ли вы поделиться кодом, как вы смешали заглавные и строчные буквы
N Sharma

они определены в моем strings.xml, например, <string name = "r1s1"> Сиэтл </ string>
user1644002

да. 21. слишком рано печатать правильно Извините
user1644002

23
Текст кнопки по умолчанию имеет заглавные буквы при использовании темы Material (или DeviceDefault с API 21+). Это работает как задумано.
alanv

Ответы:


637

Я понятия не имею, почему это происходит, но есть три тривиальные попытки:

  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

2
да, добавив это: btn [i] .setTransformationMethod (null); заставляет это работать спасибо
user1644002

2
Я принимаю ответ Никола как решение, но хочу отметить, что другая часть вопросов - это то, что предоставил alanv, который объяснил причину в комментариях выше.
user1644002

1
У меня тоже работал, использовал программный метод, так как textAllCaps XML attr поддерживается только API> 14. Спасибо!
patrickjason91

3
Я использовал <item name="android:textAllCaps">false</item>в своем определении стиля
кто-то где-то

169

Вот что я сделал в своих ценностях / 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

Это относится только к Widget.AppCompat.Button. Более общий ответ дает Ашиш Чогуле ниже, то есть непосредственно добавляет <item name = "android: textAllCaps"> false </ item> в стиль темы. (Хотя вопросы изначально задавались специально для кнопок, я думаю, что если allCaps не нужен для кнопок, он также не нужен для пунктов меню, действий и т. Д.)
user2808624

1
Не работал для меня Стал работать, когда я перешел buttonStyleнаandroid:buttonStyle
Василий Кабунов

2
В XML android:textAllCaps="false"(я использую android studio 3.0)
meyasir

107

Это можно исправить в коде приложения, установив TransformationMethod кнопки, например

mButton.setTransformationMethod(null);

Для Котлина синтаксис: mButton.transformationMethod = null
Native_Mobile_Arch_Dev,

66

Установите 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

58

добавить эту строку в стиле

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


53
Я НЕ ЗНАЮ, ПОЧЕМУ ОНИ ДЕЛАЮТ ПО УМОЛЧАНИЮ
Гленн Мейнард

5
Это тема по умолчанию в материальной теме, так как она соответствует характеру материального дизайна
QAMAR

бедные люди застряли в квадрате материала конструкции
Эрик

35

этот работает .... просто в вашем коде в нижнем коде добавьте этот:

android:textAllCaps="false"

это должно деактивировать заглавные буквы, которые U пытается набрать small.


32

Lollipop по умолчанию поставляется с «textAllCaps true», поэтому вы должны вручную сделать его ложным


5
Это приятно знать. Если есть сайт, который перечисляет все эти значения по умолчанию для каждой версии Android?
Адам


19

Есть более простой способ, который работает для всех кнопок, просто измените внешний вид кнопок в вашей теме, попробуйте это:

в значениях-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: рекомендуется следовать принципам дизайна материала, текст должен отображаться заглавными буквами, http://www.google.com/design/spec/components/buttons.html.


2
Я согласен, замечательно следовать рекомендациям по дизайну ... пока текст кнопки больше не помещается в кнопке
Кто-то где-то

Google должен просто прекратить говорить о стилях - я не знал, что на улицах люди плачут и рыдают из-за кнопок в нижнем регистре!
Бхарал

11

Использование android.support.v7.widget.AppCompatButton в XML-макете позволит вам избежать необходимости иметь 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"/>

Надеюсь это поможет.


11

Используйте эту строку android: textAllCaps = "false" в вашем xml

<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

Ява:

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

Если вы приехали сюда из-за того, что текст вашей кнопки «Фейсбук» отображается заглавными буквами, просто добавьте его android:textAllCaps="false"в свой XML-файл. Это сработало для меня.


2

ОК, просто столкнулся с этим. Кнопки в Lollipop отображаются заглавными буквами И шрифт сбрасывается на «нормальный». Но в моем случае (Android 5.02) он работал в одном макете правильно, а не в другом !?

Смена API не сработала.
Установка всех заглавных букв требует минимального API 14, и шрифт все еще сбрасывается на «нормальный».

Это потому, что стили материалов Android изменяют стили, если они не определены (поэтому они работали в одном из моих макетов, а не в другом, потому что я определил стиль).

Таким образом, легко исправить это определить стиль в манифесте для каждого действия, которое в моем случае было просто:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(надеюсь, это поможет кому-то, спасло бы меня пару часов прошлой ночью)


4
Это очень плохая попытка, просто создайте стили для ваших кнопок, один из значений 21, для которого allCaps имеет значение false. Переход на более старую тему (здесь Holo Theme) делает ваше приложение более уродливым и несовместимым с пользователем.
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 (логическое) документы для Android.


2

По умолчанию, кнопка в Android предоставляет все заглавные буквы. Если вы хотите, чтобы текст кнопки был в нижнем или смешанном регистре, вы можете отключить textAllCapsфлаг, используяandroid:textAllCaps="false"


0

Я не знаю, почему ответ @ user1010160 получил оценку 0. Я бы дал +1, если бы мне хватило репутации.

Поскольку мое приложение разработано для API менее 14, и я не хотел добавлять код в свою программу, я не нашел решения, пока не прочитал его ответ. Он сказал, что, несмотря на то, что вы сделали то, что необходимо в стилях приложения, оно не будет работать, если вы не добавите стиль в свою деятельность и не установите для textAllCaps значение false.

Недостаточно иметь стиль для действия (у моего действия был стиль), потому что стиль может по умолчанию иметь свойство AllCaps. Вы также должны явно установить в этом упражнении это свойство в false.

Теперь он у меня есть как в приложении, так и в частях Activity файла манифеста.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.