Почему на кнопке «Текст» для кнопки «Все буквы» на 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"

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

user1644002
источник
Можете ли вы поделиться кодом, как вы смешали заглавные и строчные буквы
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);
user1644002
источник
Для Котлина синтаксис: 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», поэтому вы должны вручную сделать его ложным

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

Добавьте в <Button>тег android: textAllCaps = "false" .

rajlaxmi_jagdale
источник
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.

pedroca
источник
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"/>

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

user2288580
источник
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собственность. Проверьте это, затем снимите флажок.

wisbucky
источник
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-файл. Это сработало для меня.

Mightian
источник
2

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

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

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

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

user1010160
источник
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 файла манифеста.

Цви
источник
0

Еще одна программная альтернатива Kotlin:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
источник