Чому мій текст кнопки змушений ВСІ КАПИ на Lollipop?


447

У своєму додатку "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
Текст кнопки за замовчуванням має великі літери, коли використовується тема Матеріал (або DeviceDefault з API 21+). Це працює за призначенням.
alanv

Відповіді:


636

Я не маю уявлення, чому це відбувається, але є три банальні спроби зробити:

  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); змушує його працювати
користувач1644002

2
Я приймаю відповідь Нікола як рішення, але хочу вказати на іншу частину запитань, як це передбачено alanv, який пояснив, чому саме в коментарях вище.
user1644002

1
Працював і для мене, використовував програмний метод, оскільки attr textAllCaps XML підтримує лише 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 API 14 ви можете використовувати <item name="textAllCaps">false</item>.
CommonsWare

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

1
Не працювало для мене. Став працювати , коли я змінив buttonStyleдоandroid:buttonStyle
Василь Kabunov

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>


52
Я НЕ ЗНАЮ, ЧОМУ ЗРОБИТИ ЦЕ ЗАВДАННЯ
Гленн Мейнард

5
Це за замовчуванням у матеріальній тематиці, оскільки відповідає характеру дизайну матеріалів
QAMAR

бідні люди застрягли у квадратній коробці дизайну матеріалів
eric

35

цей працює .... просто у своєму коді в нижньому коді додайте цей:

android:textAllCaps="false"

він повинен деактивувати букву з великої літери, яку U намагається набрати малою.


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 повинен просто перестати говорити про стилі - я не знав, що на вулицях плачуть і ридають ppl через малі кнопки!
бхарал

11

Використання android.support.v7.widget.AppCompatButton у макеті XML дозволить уникнути необхідності мати макет-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

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

Якщо ви приїхали сюди, тому що текст вашої кнопки у фейсбуці відображається у всіх кришках, тоді просто додайте це android:textAllCaps="false"у свій файл XML Це працювало для мене.


2

Гаразд, просто наткнувся на це. Кнопки в Lollipop виходять з великого регістру І шрифт скидається на "нормальний". Але в моєму випадку (Android 5.02) він працював в одному макеті правильно, а не в іншому !?

Зміна API не працювала.
Якщо встановити всі великі літери, потрібно min API 14, а шрифт все одно скидається до "normal".

Це тому, що стилі матеріальних стилів Android примушують змінити стилі, якщо не визначений один (саме тому він працював в одному з моїх макетів, а не в іншому, тому що я визначив стиль).

Тож легко виправити - визначити стиль у маніфесті для кожної діяльності, яка в моєму випадку була просто:
android: topic = "@ android: style / Theme.NoTitleBar.Fullscreen"
(сподіваюся, що це комусь допоможе, врятувало б мені пару годин минулої ночі)


4
Це дуже погана спроба, просто створіть стилі для своїх кнопок, один у значень-21, у яких allCaps помилково. Повернення до старої теми (тут тема 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);
    }
}

Див. Додатки Android AppCompatButton # setSupportAllCaps (булева) .


2

За замовчуванням кнопка в android надає ключове слово з усіма кришками. Якщо ви хочете, щоб текст кнопки був малим або змішаним, ви можете відключити textAllCapsпрапор, використовуючиandroid:textAllCaps="false"


0

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

Оскільки мій додаток розроблено для API менше 14, і я не хотів додавати код до своєї програми, я не знайшов рішення, поки не прочитав його відповідь. Він сказав, що навіть якщо ви зробили те, що потрібно в стилях додатків, це не працюватиме, якщо ви не додасте стиль до своєї діяльності і там не встановите textAllCaps на хибне.

Недостатньо мати стиль для діяльності (у моїй діяльності був стиль), оскільки стиль може бути за замовчуванням для властивості AllCaps. Ви також повинні в явному режимі встановити це властивість як false.

Тепер я маю це як у програмі, так і в розділі "Активність" файлу маніфесту.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.