Cách thay đổi kiểu của TextView trong thời gian chạy


98

Tôi có một ứng dụng android trên đó, khi người dùng nhấn vào a TextView, tôi muốn áp dụng một kiểu đã xác định.

Tôi nghĩ để tìm một textview.setStyle()nhưng nó không tồn tại. Tôi đã thử

textview.setTextAppearance();

Nhưng nó không hoạt động.


1
Tôi đã đọc ở đâu đó rằng điều này là không thể ... stackoverflow.com/questions/2016249/… . Nhưng bạn có thể đặt một số thuộc tính riêng biệt.
Floern

1
Bạn đã thử: textView.setTextTypeface chưa? developer.android.com/reference/android/widget/…
Jonathan Roth

21
@Falmarri BẠN đã xem qua các tài liệu api TextView chưa? Nếu vậy, có lẽ bạn có thể nói điều gì đó mang tính xây dựng hơn.
Fletch

Câu trả lời:


143

Tôi đã thực hiện việc này bằng cách tạo một tệp XML mới res/values/style.xmlnhư sau:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

Tôi cũng có một mục nhập trong tệp "string.xml" của mình như sau:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

Sau đó, trong mã của mình, tôi đã tạo ClickListener để bẫy sự kiện nhấn trên TextView đó: CHỈNH SỬA: Như từ API 23 'setTextAppearance' không được dùng nữa

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

Để thay đổi nó trở lại, bạn sẽ sử dụng cái này:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);

2
Trên thực tế, điều này không hoạt động với các kiểu bóng. Nếu bạn muốn thay đổi bóng, bạn phải thực hiện theo cách này: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas

3
Để tránh việc kiểm tra SDK, bạn có thể sử dụng TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler

90

Giống như Jonathan đã đề xuất, sử dụng textView.setTextTypefacecác tác phẩm, tôi vừa sử dụng nó trong một ứng dụng cách đây vài giây.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.

9
Bạn có thể sử dụng textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps

2
textView.setTypeface (null, Typeface.BOLD) là thứ phù hợp với tôi. Tất nhiên, bạn có thể sử dụng 1 thay thế nhưng tôi đoán không phải là một phương pháp hay để nhập hằng số theo cách thủ công. Sử dụng tốt hơn các biến được xác định trước trong thư viện.
Pijusn

4
Không khuyến khích người dân sử dụng ints thay vì hằng
Chris.Jenkins

3
Tốt! Sai lầm của tôi là tôi đã gửi kiểu chữ cũ của mình trong tham số đầu tiên. Vì vậy, nó hoạt động khi tôi thay đổi NORMAL -> BOLD nhưng không BOLD -> NORMAL. Tôi không biết tham số đầu tiên có thể là null! Bây giờ nó hoạt động tốt cho tôi!
Felipe

12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Bạn đặt nó từ mã. Kiểu chữ


4

Lập trình: Thời gian chạy

Bạn có thể lập trình bằng setTypeface ():

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: Thời gian thiết kế

Bạn cũng có thể đặt bằng XML:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

Hy vọng điều này sẽ giúp

Được tổng hợp


2

tôi thấy textView.setTypeface(Typeface.DEFAULT_BOLD);là phương pháp đơn giản nhất.


Điều này thay đổi Kiểu chữ. không phải kiểu như OP chỉ định.
HBG

Đúng, đây vẫn là phương pháp đơn giản nhất - và theo như tôi nhớ lại là phương pháp duy nhất - tại thời điểm đăng bài viết. Tôi không chắc liệu phương thức API mới có được thêm vào trong thời gian đó hay không để cho phép thay đổi "kiểu" thành chữ đậm mà không làm thay đổi kiểu chữ. Vui long sửa cho tôi nêu tôi sai.
sfera

1

hãy thử dòng mã này.

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

ở đây, nó sẽ nhận Kiểu chữ hiện tại từ chế độ xem văn bản này và thay thế nó bằng Kiểu chữ mới. Kiểu chữ mới ở đây là DEFAULT_BOLDnhưng bạn có thể áp dụng nhiều hơn nữa.


bạn muốn giải thích tại sao mã của bạn sẽ giải quyết được vấn đề của anh ấy, cảm ơn.
Muhammed Refaat

OP muốn thay đổi kiểu chứ không phải kiểu chữ.
HBG

0

Xem doco cho setText () trong TextView http://developer.android.com/reference/android/widget/TextView.html

Để tạo kiểu cho các chuỗi của bạn, hãy đính kèm các đối tượng android.text.style. * Vào một SpannableString hoặc xem tài liệu Các loại tài nguyên có sẵn để biết ví dụ về cách đặt văn bản được định dạng trong tệp tài nguyên XML.


0

Tùy thuộc vào phong cách bạn muốn thiết lập mà bạn phải sử dụng các phương pháp khác nhau. Nội dung TextAppearance có setter riêng, TypeFace có setter riêng, background có setter riêng, v.v.

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.