Có cách nào để tạo kiểu cho TextView để viết hoa tất cả các chữ cái của nó không?


239

Tôi muốn có thể gán thuộc tính hoặc kiểu xml cho một thuộc tính TextViewsẽ tạo bất kỳ văn bản nào có trong TẤT CẢ CÁC BÀI VIẾT VỐN.

Các thuộc tính android:inputType="textCapCharacters"android:capitalize="characters"không làm gì cả và trông giống như chúng dành cho văn bản người dùng nhập vào, không phải là a TextView.

Tôi muốn làm điều này để tôi có thể tách phong cách khỏi nội dung. Tôi biết tôi có thể làm điều này theo chương trình nhưng một lần nữa tôi muốn giữ phong cách ngoài nội dung và mã.


1
không inputType = "textCapChar character", text ALLCaps = "true" hoạt động trong smasung famili ^^. Tôi đã thêm TextWatcher vào EditText của mình, ghi lại tất cả các từ
murt

Câu trả lời:


356

Tôi mặc dù đó là một yêu cầu khá hợp lý nhưng có vẻ như bạn không thể thực hiện nó vào lúc này. Thật là một thất bại hoàn toàn. cười lớn

Cập nhật

Bây giờ bạn có thể sử dụng textAllCaps để buộc tất cả các mũ.


14
thuộc tính textview chắc chắn là thiếu. cũng sẽ rất tuyệt nếu gán một ttf từ thư mục thuộc tính!
Nathan Schwermann

8
Một trong những câu trả lời cho câu hỏi được liên kết gợi ý 'android: textAllCaps = "true"' Điều này hiệu quả với tôi.
blaffie

@blaffie Cảm ơn đã cập nhật. Tôi sẽ kiểm tra xem android: textAllCaps = "true" có hoạt động tốt không.
Terrance

1
Bạn có thể làm điều đó bằng cách sử dụng thuộc tính "textAllCaps", do đó downvote.
JaydeepW

1
Có vẻ như textAllCapsnguyên nhân App để sụp đổ nếu bạn chỉ định android:fontFamilytrong themes.xml.
Alaa M.

142

Thế còn android: text ALLCaps ?


8
@ larham1 Đây là một thuộc tính xml vì vậy tôi không thấy nó có thể được sử dụng như thế nào. Nếu không làm việc, hãy báo cáo cho Google. Tôi cho rằng nó bị giới hạn ở cấp độ API 14 như setAllCaps (boolean).
Murphy

1
Tôi vừa thử nghiệm điều này và nó đang hoạt động. Tôi có một tệp kiểu bên ngoài
7heViking

1
@Murphy có, đây là một vấn đề phiên bản. SDK 14 trở lên cho setAllCaps (); không rõ ràng khi xml được thêm vào, nhưng tôi giả sử SDK 14 cũng vậy.
larham1

Điều này thật lạ, textAllCaps hoạt động trong một dự án thử nghiệm đơn giản, nhưng khi chế độ xem được tạo bên trong ArrayAd Module.getView () thì không. Mọi thứ đều hoạt động: nền, textStyle, v.v., nhưng text ALLCaps không :(
Y2i

1
@JawadLeWywadi bạn không thể sử dụng thuộc tính xml này trước API 14. Bạn cần thực hiện thủ công bằng mã Java.
Murphy

63

Bằng cách sử dụng AppCompat textAllCaps trong Ứng dụng Android hỗ trợ API cũ hơn (dưới 14)

Có một widget UI đi kèm với AppCompat có tên CompatTextView là một tiện ích mở rộng TextView tùy chỉnh bổ sung hỗ trợ cho textAllCaps

Đối với API Android mới hơn> 14, bạn có thể sử dụng:

android:textAllCaps="true"

Một ví dụ đơn giản:

<android.support.v7.internal.widget.CompatTextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textAllCaps="true"/>

Nguồn: developer.android

Cập nhật:

Vì vậy, CompatTextView đã được thay thế bởi AppCompatTextView trong thư viện appcompat-v7 mới nhất ~ Eugen Pechanec


Bạn có nhận thấy nội bộ trong android.support.v7.iternal không? Nội bộ như trong có thể không còn nữa trong phiên bản tiếp theo của thư viện hỗ trợ?
Emanuel Moecklin

1
Điều này thật tuyệt! @EmanuelMoecklin Một khi bạn có nó trong dự án của mình, nó sẽ không chạy một cách kỳ diệu.
Eugen Pechanec

@eugen tất nhiên bạn không bao giờ cập nhật thư viện hỗ trợ lên phiên bản mới nhất vì Google không bao giờ thêm bất cứ điều gì hữu ích, phải không?
Emanuel Moecklin

@EmanuelMoecklin Thật ra tôi thường cập nhật rất nhanh, nó phá vỡ mã của tôi: DI hoàn toàn đồng ý rằng bạn nên cảnh giác khi sử dụng tài nguyên nội bộ NHƯNG tôi chỉ lướt qua nguồn appcompat-v7 và CompatTextViewđược sử dụng trong ScrollingTabCointainerViewđó ToolbarWidgetWrapper, nghe có vẻ khá mới và miễn là cái tên giữ "v7" trong tên của nó, đây là một sự đảm bảo đủ tốt cho tôi rằng CompatTextViewnó sẽ giữ nguyên vị trí của nó.
Eugen Pechanec

2
@EmanuelMoecklin Vì vậy, nó CompatTextViewđã được thay thế bằng AppCompatTextViewthư viện appcompat-v7 mới nhất. Bạn đã khá đúng.
Eugen Pechanec

30

Điều thực sự rất đáng thất vọng là bạn không thể làm điều đó với các kiểu ( <item name="android:textAllCaps">true</item>) hoặc trên mỗi tệp bố cục XML với thuộc tính textAllCaps và cách duy nhất để thực hiện là sử dụng theString.toUpperCase () trên mỗi chuỗi khi bạn thực hiện một textViewXXX.setText (theString).

Trong trường hợp của tôi, tôi không muốn cóString.toUpperCase () ở mọi nơi trong mã của mình nhưng phải có một nơi tập trung để làm điều đó bởi vì tôi có một số Hoạt động và liệt kê các bố cục các mục với TextViews được cho là được viết hoa mọi lúc (a tiêu đề) và những người khác không ... vì vậy ... một số người có thể nghĩ là quá mức cần thiết, nhưng tôi đã tạo lớp CapitalizedTextView của riêng mình mở rộng android.widget.TextView và vượt qua phương thức setText viết hoa văn bản một cách nhanh chóng.

Ít nhất, nếu thiết kế thay đổi hoặc tôi cần xóa văn bản viết hoa trong các phiên bản trong tương lai, tôi chỉ cần thay đổi thành TextView bình thường trong các tệp bố cục.

Bây giờ, hãy xem xét rằng tôi đã làm điều này bởi vì Nhà thiết kế ứng dụng thực sự muốn văn bản này (các tiêu đề) trong CAPS trên khắp Ứng dụng bất kể viết hoa nội dung ban đầu và tôi cũng có các TextView thông thường khác, nơi viết hoa đi kèm với nội dung thực tế .

Đây là lớp học:

package com.realactionsoft.android.widget;

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.ViewTreeObserver; 
import android.widget.TextView;


public class CapitalizedTextView extends TextView implements ViewTreeObserver.OnPreDrawListener {

    public CapitalizedTextView(Context context) {
        super(context);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text.toString().toUpperCase(), type);
    }

}

Và bất cứ khi nào bạn cần sử dụng nó, chỉ cần khai báo nó với tất cả các gói trong bố cục XML:

<com.realactionsoft.android.widget.CapitalizedTextView 
        android:id="@+id/text_view_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

Một số người sẽ lập luận rằng cách chính xác để định kiểu văn bản trên TextView là sử dụng SpannableString , nhưng tôi nghĩ rằng nó thậm chí còn quá mức cần thiết, chưa kể đến việc tiêu tốn nhiều tài nguyên hơn vì bạn sẽ tạo ra một lớp khác so với TextView.


9

Tôi đã đưa ra một giải pháp tương tự với RacZo trong thực tế là tôi cũng đã tạo ra một lớp con TextViewxử lý làm cho văn bản trở thành chữ hoa.

Sự khác biệt là thay vì ghi đè một trong các setText()phương thức, tôi đã sử dụng một cách tiếp cận tương tự như những gì TextViewthực sự làm trên API 14+ (theo quan điểm của tôi là một giải pháp sạch hơn).

Nếu bạn nhìn vào nguồn , bạn sẽ thấy việc triển khai setAllCaps():

public void setAllCaps(boolean allCaps) {
    if (allCaps) {
        setTransformationMethod(new AllCapsTransformationMethod(getContext()));
    } else {
        setTransformationMethod(null);
    }
}

Các AllCapsTransformationMethodlớp học không phải là (hiện tại) công cộng, nhưng vẫn còn, nguồn cũng có sẵn . Tôi đã đơn giản hóa lớp đó một chút (loại bỏ setLengthChangesAllowed()phương thức), vì vậy giải pháp hoàn chỉnh là đây:

public class UpperCaseTextView extends TextView {

    public UpperCaseTextView(Context context) {
        super(context);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setTransformationMethod(upperCaseTransformation);
    }

    private final TransformationMethod upperCaseTransformation =
            new TransformationMethod() {

        private final Locale locale = getResources().getConfiguration().locale;

        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return source != null ? source.toString().toUpperCase(locale) : null;
        }

        @Override
        public void onFocusChanged(View view, CharSequence sourceText,
                boolean focused, int direction, Rect previouslyFocusedRect) {}
    };
}

2

Có vẻ như có quyền trên cài đặt bàn phím di động, vì vậy cách dễ nhất để làm điều này là:

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

hy vọng điều này sẽ làm việc


1

Dự án PixlUI cho phép bạn sử dụng text ALLCaps trong bất kỳ textview hoặc lớp con nào của textview bao gồm: Nút, EditText AutoCompleteEditText Checkbox RadioButton và một số thứ khác.

Bạn sẽ cần tạo các bản xem xét văn bản của mình bằng phiên bản pixlui chứ không phải các bản từ nguồn Android, nghĩa là bạn phải làm điều này:

<com.neopixl.pixlui.components.textview.TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        pixlui:textAllCaps="true" />

PixlUI cũng cho phép bạn đặt một kiểu chữ / phông chữ tùy chỉnh mà bạn đặt trong thư mục tài sản của mình.

Tôi đang làm việc trên một ngã ba Gradle của khung PixlUI sử dụng gradle và cho phép một người chỉ định textAllCaps cũng như kiểu chữ từ các kiểu thay vì yêu cầu chúng nội tuyến như dự án ban đầu.

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.