Tại sao văn bản Nút của tôi buộc phải TẤT CẢ CAPS trên Lollipop?


447

Trong ứng dụng của tôi "Tide Now WA" mà gần đây tôi đã kiểm tra tính tương thích bằng máy tính bảng Nexus 9 mới (Lollipop - API 21).

Nó viết một số nút văn bản. Ứng dụng này viết văn bản chính xác bằng Android 2.3 và Android 4.0. Tức là hỗn hợp vốn và chữ thường.

Khi cùng một ứng dụng được chạy trên Nexus 9 của tôi, tất cả các chữ cái trong văn bản đều được viết hoa.

FWIW tệp kê khai của tôi chứa tuyên bố sau:

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

Tôi có thể sửa lỗi này trong mã của mình không hoặc nó có phải là lỗi trong HĐH không


Bạn có thể chia sẻ mã làm thế nào bạn trộn lẫn chữ in hoa và chữ thường
N Sharma

chúng được định nghĩa trong chuỗi String của tôi, chẳng hạn như <string name = "r1s1"> Seattle </ string>
user1644002

Đúng. 21. quá sớm để gõ đúng. Xin lỗi
user1644002

23
Văn bản nút là tất cả các chữ hoa theo mặc định khi sử dụng chủ đề Vật liệu (hoặc DeviceDefault với API 21+). Đây là làm việc như dự định.
alanv

Câu trả lời:


636

Tôi không biết tại sao nó lại xảy ra nhưng có 3 nỗ lực tầm thường để thực hiện:

  1. Sử dụng android:textAllCaps="false"trong của bạnlayout-v21

  2. Lập trình thay đổi phương pháp chuyển đổi của nút. mButton.setTransformationMethod(null);

  3. Kiểm tra phong cách của bạn cho Allcaps

Lưu ý : public void setAllCaps(boolean allCaps), android:textAllCapssẵn từ API phiên bản 14.


# 1 không có sự khác biệt. Không chắc chắn làm thế nào để làm # 3, không có phong cách? Hiện đang thử # 2.
dùng1644002

2
có, thêm cái này: btn [i] .setTransaturesMethod (null); làm cho nó hoạt động nhờ
user1644002

2
Tôi chấp nhận câu trả lời của Nikola là giải pháp, nhưng muốn chỉ ra phần khác của câu hỏi là do alanv cung cấp, người đã giải thích lý do tại sao trong các bình luận ở trên.
dùng1644002

1
Tôi cũng làm việc với tôi, đã sử dụng phương pháp lập trình vì văn bản XML ALLCaps chỉ được hỗ trợ API> 14. cảm ơn!
patrickjason91

3
Tôi đã sử dụng <item name="android:textAllCaps">false</item>trong định nghĩa phong cách của mình
Ai đó ở đâu đó

169

Đây là những gì tôi đã làm trong các giá trị / chủ đề của tôi

    <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
Để được hỗ trợ API cấp 14, bạn có thể sử dụng <item name="textAllCaps">false</item>.
CommonsWare

Điều này chỉ áp dụng cho Widget.AppCompat.Button. Câu trả lời tổng quát hơn được đưa ra bởi Ashish Chaugule bên dưới, tức là thêm trực tiếp <item name = "android: textAllCaps"> false </ item> vào kiểu chủ đề. (Mặc dù các câu hỏi ban đầu được hỏi đặc biệt là các nút, tôi nghĩ rằng nếu allCaps không muốn cho các nút, thì nó cũng không muốn cho các mục menu, hành động, v.v.)
user2808624

1
Không làm việc cho tôi. Trở thành làm việc khi tôi đổi buttonStylethànhandroid:buttonStyle
Vasily Kabunov

2
Trong XML android:textAllCaps="false"(Tôi đang sử dụng android studio 3.0)
meyasir

107

Điều này có thể sửa được trong mã ứng dụng bằng cách đặt TransformMethod của nút, ví dụ:

mButton.setTransformationMethod(null);

Đối với Kotlin, cú pháp là: mButton.transaturesMethod = null
Native_Mobile_Arch_Dev

66

Đặt android: text ALLCaps = "false". Nếu bạn đang sử dụng kiểu appcompat, hãy đảm bảo textAllCaps xuất hiện trước kiểu. Nếu không thì phong cách sẽ ghi đè lên nó. Ví dụ:

android:textAllCaps="false"
style="@style/Base.TextAppearance.AppCompat"

Làm việc như một bùa mê nhưng trong trường hợp của tôi, tôi đã phải làm như: <style name = "textAppparentButton" Parent = "@ android: style / TextAppparent.M vật liệu / mục> </ style>
Vfleitao

58

thêm dòng này trong phong cách

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


52
TÔI KHÔNG BIẾT TẠI SAO BẠN NÊN LÀM CÁI NÀY
Glenn Maynard

5
Đây là mặc định trong chủ đề vật liệu, vì nó phù hợp với tính chất của thiết kế vật liệu
QAMAR

Người nghèo mắc kẹt trong hộp vuông của thiết kế vật liệu
eric

35

cái này đang hoạt động .... chỉ trong mã của bạn trong mã dưới cùng của bạn thêm cái này:

android:textAllCaps="false"

cần hủy kích hoạt chữ cái mũ mà bạn đang cố gõ nhỏ.


32

Mặc định Lollipop đi kèm với "textAllCaps true", vì vậy bạn phải tự làm nó thành false


5
Đó là điều tuyệt vời để biết. Nếu có một trang web liệt kê tất cả các giá trị mặc định này cho mỗi phiên bản Android?
Adam


19

Có một cách dễ dàng hơn để làm việc cho tất cả các nút, chỉ cần thay đổi giao diện của các nút trong chủ đề của bạn, hãy thử điều này:

trong giá trị-21 / style.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: bạn nên tuân thủ các nguyên tắc thiết kế vật liệu, bạn nên hiển thị văn bản viết hoa trong Nút, http://www.google.com/design/spec/components/buttons.html


2
Tôi đồng ý, thật tuyệt khi làm theo hướng dẫn thiết kế ... cho đến khi văn bản nút không còn vừa với nút
Ai đó ở đâu đó vào

google chỉ nên ngừng nói về phong cách - tôi đã không biết rằng có ppl khóc và khóc nức nở trên đường phố vì các nút chữ thường!
bharal

11

Sử dụng android.support.v7.widget.AppCompatButton trong bố cục XML sẽ cho phép bạn tránh phải có bố cục-21 hoặc thay đổi bất cứ thứ gì theo chương trình. Đương nhiên, điều này cũng sẽ hoạt động với thư viện 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"/>

Hi vọng điêu nay co ich.


11

Sử dụng dòng này android: text ALLCaps = "false" trong xml của bạn

<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

Trong Android Studio IDE, bạn phải nhấp vào biểu tượng Bộ lọc để hiển thị các thuộc tính chuyên gia. Sau đó, bạn sẽ thấy textAllCapstài sản. Kiểm tra nó, sau đó bỏ chọn nó.


9

Bạn có thể thêm android:textAllCaps="false"vào nút.

Văn bản nút có thể được chuyển thành chữ hoa theo chủ đề ứng dụng của bạn áp dụng cho tất cả các nút. Kiểm tra tập tin chủ đề / kiểu để thiết lập thuộc tính android:textAllCaps.


9

Java:

yourButton.setAllCaps(false);

Kotlin:

yourButton.isAllCaps = false

XML:

android:textAllCaps="false"

Kiểu dáng:

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

Trong cách bố trí:

   <Button
      .
      .
      style="@style/yourButtonStyle"
      .
      .
   />

4

Nếu bạn đã đến đây vì văn bản nút facebook của bạn xuất hiện trong tất cả các chữ hoa thì chỉ cần thêm phần này android:textAllCaps="false"vào tệp xml của bạn. Nó làm việc cho tôi.


2

OK, chỉ cần chạy vào đây. Các nút trong Lollipop xuất hiện tất cả chữ hoa VÀ phông chữ được đặt lại thành 'bình thường'. Nhưng trong trường hợp của tôi (Android 5.0), nó hoạt động theo một bố cục chính xác, nhưng không phải là bố cục khác!?

Thay đổi API không hoạt động.
Cài đặt cho tất cả các giới hạn yêu cầu API tối thiểu 14 và phông chữ vẫn đặt lại thành 'bình thường'.

Đó là vì Kiểu vật liệu Android buộc thay đổi kiểu nếu không có kiểu nào được xác định (đó là lý do tại sao nó hoạt động theo một trong các bố cục của tôi chứ không phải kiểu khác vì tôi đã xác định kiểu).

Vì vậy, cách khắc phục dễ dàng là xác định một kiểu trong tệp kê khai cho từng hoạt động mà trong trường hợp của tôi chỉ là:
android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen"
(hy vọng điều này sẽ giúp ai đó, sẽ cứu tôi một vài của giờ tối qua)


4
Đó là một nỗ lực rất tệ, chỉ cần tạo kiểu cho các nút của bạn, một trong các giá trị-21 có allCaps sai. Quay trở lại một chủ đề cũ hơn (ở đây là Holo Theme) làm cho ứng dụng của bạn xấu hơn và không phù hợp hơn với người dùng.
bluewhile 14/03/2015

2

Nếu bạn sử dụng appcompat-v7, bạn có thể phân lớp AppCompatButtonsetSupportAllCaps(false)sau đó sử dụng lớp này cho tất cả các nút của bạn.

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

Xem tài liệu Android AppCompatButton # setSupport ALLCaps (boolean) .


2

Theo mặc định, Nút trong Android cung cấp tất cả các từ khóa mũ. Nếu bạn muốn văn bản nút ở dạng chữ thường hoặc chữ thường, bạn có thể tắt textAllCapscờ bằng cách sử dụngandroid:textAllCaps="false"


0

Tôi không biết lý do tại sao câu trả lời của @ user1010160 được xếp hạng 0. Tôi sẽ cho điểm +1 nếu tôi có đủ danh tiếng.

Vì ứng dụng của tôi được thiết kế cho API dưới 14 và tôi không muốn thêm mã vào chương trình của mình nên tôi không tìm thấy giải pháp nào cho đến khi tôi đọc câu trả lời của anh ấy. Những gì anh ấy nói là mặc dù bạn đã thực hiện những gì cần thiết trong các kiểu Ứng dụng, nhưng nó sẽ không hoạt động trừ khi bạn thêm một kiểu vào hoạt động của mình và ở đó bạn đặt textAllCaps thành false.

Nó không đủ để có một kiểu cho hoạt động (hoạt động của tôi có một kiểu), bởi vì kiểu này có thể mặc định cho thuộc tính AllCaps. Bạn phải đặt rõ ràng, trong hoạt động cũng vậy, thuộc tính đó thành false.

Bây giờ tôi có cả trong Ứng dụng và trong các phần Hoạt động của tệp kê khai.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.