Dlaczego mój tekst przycisku jest wymuszany na WSZYSTKIE CAPSY na Lollipop?

447

W mojej aplikacji „Tide Now WA”, którą ostatnio przetestowałem pod kątem zgodności z nowym tabletem Nexus 9 (Lollipop - API 21).

Zapisuje tekst przycisku. Ta aplikacja poprawnie zapisuje tekst w systemie Android 2.3 i Android 4.0. Tj. Mieszane wielkie i małe litery.

Gdy ta sama aplikacja jest uruchomiona na moim Nexusie 9, wszystkie litery w tekście są pisane wielkimi literami.

FWIW mój manifest zawiera następujące oświadczenie:

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

Czy mogę to naprawić w kodzie, czy jest to błąd w systemie operacyjnym dzięki

użytkownik1644002
źródło
Czy możesz podzielić się kodem, w jaki sposób zmieszałeś wielkie i małe litery
N Sharma
są one zdefiniowane w moim strings.xml, takim jak <string name = "r1s1"> Seattle </string>
user1644002
tak. 21. za wcześnie, aby pisać poprawnie. Przepraszamy
użytkownik1644002
23
Tekst przycisku jest domyślnie wielkimi literami, gdy używany jest motyw Materiał (lub DeviceDefault z API 21+). Działa to zgodnie z przeznaczeniem.
alanv

Odpowiedzi:

636

Nie mam pojęcia, dlaczego tak się dzieje, ale są 3 trywialne próby:

  1. Użyj android:textAllCaps="false"w swoimlayout-v21

  2. Programowo zmień metodę transformacji przycisku. mButton.setTransformationMethod(null);

  3. Sprawdź swój styl pod kątem Allcaps

Uwaga : public void setAllCaps(boolean allCaps), android:textAllCapsdostępne z interfejsu API w wersji 14.

Nikola Despotoski
źródło
# 1 nie zrobił różnicy. Nie wiesz, jak zrobić # 3, nie masz stylów? Teraz próbuję # 2.
user1644002
2
tak, dodając to: btn [i] .setTransformationMethod (null); sprawia, że ​​działa dzięki
user1644002
2
Akceptuję odpowiedź Nikoli jako rozwiązanie, ale chciałbym zwrócić uwagę na drugą część pytań, którą podał Alanv, który wyjaśnił dlaczego w komentarzach powyżej.
user1644002,
1
Pracowałem też dla mnie, użyłem metody programistycznej, ponieważ textAllCaps XML attr jest obsługiwany tylko API> 14. dzięki!
patrickjason91
3
Użyłem <item name="android:textAllCaps">false</item>w mojej definicji stylu
Someone Somewhere
169

Oto, co zrobiłem w mojej wartości / 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>
miguel
źródło
8
Aby uzyskać obsługę interfejsu API przed poziomem 14, można użyć <item name="textAllCaps">false</item>.
CommonsWare
Dotyczy to tylko Widget.AppCompat.Button. Bardziej ogólną odpowiedź podaje poniższy Ashish Chaugule, tj. Dodanie bezpośrednio <item name = "android: textAllCaps"> false </item> do stylu motywu. (Chociaż pytania były pierwotnie zadawane szczególnie w przypadku przycisków, myślę, że jeśli nie jest potrzebna funkcja allCaps dla przycisków, nie jest również potrzebna w przypadku pozycji menu, akcji itp.)
user2808624
1
Nie działało dla mnie. Zacząłem pracować, kiedy zmieniłem się buttonStylenaandroid:buttonStyle
Wasilij Kabunow
2
W języku XML android:textAllCaps="false"(używam Androida studio 3.0)
meyasir
107

Można to naprawić w kodzie aplikacji, ustawiając metodę transformacji przycisku, np

mButton.setTransformationMethod(null);
użytkownik1644002
źródło
W przypadku Kotlin składnia jest następująca: mButton.transformationMethod = null
Native_Mobile_Arch_Dev
66

Ustaw Androida: textAllCaps = „false”. Jeśli używasz stylu appcompat, upewnij się, że textAllCaps znajduje się przed stylem. W przeciwnym razie styl zastąpi go. Na przykład:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"
Bob Bobington
źródło
Pracowałem jak urok, ale w moim przypadku musiałem zrobić: <style name = "textAppearanceButton" parent = "@ android: style / TextAppearance.Material.Widget.Button"> <item name = "android: textAllCaps"> false < / item> </style>
Vfleitao
58

dodaj tę linię w dobrym stylu

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

Ashish Chaugule
źródło
52
NIE WIEM, DLACZEGO TO UCZYNIĄ DOMYŚLNIE
Glenn Maynard
5
Jest to domyślne ustawienie w temacie materiałowym, ponieważ pasuje do charakteru projektowania materiałów
QAMAR,
biedni ludzie utknęli w kwadratowym pudełku z materialnego projektu
er.
35

ten działa .... po prostu w kodzie w dolnym kodzie dodaj ten:

android:textAllCaps="false"

powinien dezaktywować wielką literę, którą próbujesz wpisać na małą literę.

parsa sarshar
źródło
32

Domyślnie Lollipop zawiera „textAllCaps true”, więc musisz ręcznie ustawić wartość false

tharinduNA
źródło
5
Dobrze wiedzieć. Czy istnieje witryna z listą wszystkich tych wartości domyślnych dla poszczególnych wersji Androida?
Adam
23

Dodaj Androida: textAllCaps = "false" w <Button>znaczniku, który to jest.

rajlaxmi_jagdale
źródło
19

Jest łatwiejszy sposób, który działa dla wszystkich przycisków, wystarczy zmienić wygląd przycisków w motywie, spróbuj tego:

w wartości-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: zalecane jest przestrzeganie zasad projektowania materiałów, powinieneś wyświetlać duży tekst w Buttons, http://www.google.com/design/spec/components/buttons.html

pedroca
źródło
2
Zgadzam się, świetnie jest postępować zgodnie z wytycznymi projektowymi ... dopóki tekst przycisku nie będzie już pasował do przycisku
Someone Somewhere
Google powinien po prostu przestać mówić o stylach - nie wiedziałem, że ludzie płaczą i szlochają na ulicach z powodu małych liter!
bharal
11

Korzystanie z android.support.v7.widget.AppCompatButton w układzie XML pozwoli ci uniknąć konieczności posiadania układu 21 lub programowej zmiany czegokolwiek. Oczywiście będzie to również działać z biblioteką 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"/>

Mam nadzieję że to pomoże.

użytkownik2288580
źródło
11

Użyj tej linii android: textAllCaps = "false" w swoim pliku 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"
           />
Abdul Basit Rishi
źródło
9

W Android Studio IDE musisz kliknąć ikonę Filtruj, aby wyświetlić właściwości eksperta. Wtedy zobaczysz textAllCapsnieruchomość. Zaznacz to, a następnie odznacz.

wisbucky
źródło
9

Możesz dodać android:textAllCaps="false"do przycisku.

Tekst przycisku może zostać przekształcony na duże litery według motywu aplikacji, który dotyczy wszystkich przycisków. Sprawdź pliki motywów / stylów, aby ustawić atrybut android:textAllCaps.

Chakri Reddy
źródło
9

Jawa:

yourButton.setAllCaps(false);

Kotlin:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

Style:

    <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>

W układzie:

   <Button
      .
      .
      style="@style/yourButtonStyle"
      .
      .
   />
Amir Hossein Ghasemi
źródło
4

Jeśli przyjechałeś tutaj, ponieważ tekst przycisku na Facebooku jest wyświetlany wielkimi literami, po prostu dodaj go android:textAllCaps="false"do pliku xml. To zadziałało dla mnie.

Mightian
źródło
2

OK, właśnie na to wpadłem. Przyciski w Lollipop wychodzą z wielkich liter ORAZ czcionka resetuje się do „normalnej”. Ale w moim przypadku (Android 5.02) działał poprawnie w jednym układzie, ale nie w innym !?

Zmiana interfejsów API nie działała.
Ustawienie wszystkich wielkich liter wymaga min API 14, a czcionka nadal resetuje się do „normalnej”.

To dlatego, że style materiałów Androida wymuszają zmianę stylów, jeśli nie ma jednego zdefiniowanego (dlatego działał w jednym z moich układów, a nie w drugim, ponieważ zdefiniowałem styl).

Łatwym rozwiązaniem jest więc zdefiniowanie stylu w manifeście dla każdego działania, które w moim przypadku było po prostu:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(mam nadzieję, że to komuś pomoże, uratowałoby mi parę godzin ostatniej nocy)

użytkownik1010160
źródło
4
To bardzo zła próba, po prostu stwórz style dla swoich przycisków, jeden w wartości 21, w którym allCaps ma wartość false. Powrót do starszego motywu (tutaj Motyw Holo) sprawia, że ​​aplikacja jest brzydsza i niespójna dla użytkownika.
bluewhile
2

Jeśli używasz appcompat-v7, możesz podklasy AppCompatButtoni setSupportAllCaps(false), a następnie użyć tej klasy do wszystkich przycisków.

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

Zobacz AppCompatButton # setSupportAllCaps (boolean) Dokumenty na Androida.

hidro
źródło
2

Domyślnie Button w Androidzie zawiera słowo kluczowe all caps. Jeśli chcesz, aby tekst przycisku był pisany małymi lub wielkimi literami, możesz wyłączyć textAllCapsflagę za pomocąandroid:textAllCaps="false"

Reyaz Ahmad
źródło
0

Nie wiem, dlaczego odpowiedź @ user1010160 uzyskała ocenę 0. Dałbym +1, gdybym miał wystarczająco dużo reputacji.

Ponieważ moja aplikacja jest zaprojektowana dla API mniejszych niż 14 i nie chciałem dodawać kodu do mojego programu, nie znalazłem rozwiązania, dopóki nie przeczytałem jego odpowiedzi. Powiedział, że nawet jeśli zrobiłeś to, co jest potrzebne w stylach aplikacji, to nie zadziała, dopóki nie dodasz stylu do swojej aktywności i nie ustawisz wartości textAllCaps na false.

It is not enough to have a style for the activity (my activity had a style), because the style might defaults to the AllCaps property. You have to set explicitly, in the activity too, that property to false.

I now have it both in the Application and in the Activity parts of the manifest file.

Zvi
źródło
0

Another programmatic Kotlin Alternative:

mButton.transformationMethod = null

Native_Mobile_Arch_Dev
źródło