Android - thiết lập TextView TextStyle theo chương trình?


232

Có cách nào để thiết lập textStylethuộc tính của một TextViewchương trình không? Có vẻ như không phải là một setTextStyle()phương pháp.

Để rõ ràng, tôi không nói về phong cách View / Widget! Tôi đang nói về những điều sau đây:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
bạn có thể tham khảo liên kết bên dưới và khóa 1 câu trả lời hàng đầu stackoverflow.com/questions/6200533/ Khăn
Tiep

Vui lòng kiểm tra câu trả lời của tôi ở đây . Hy vọng điều này sẽ giúp bạn
Summain Jain

Câu trả lời:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface là thuộc tính textStyle.

Như Shankar V đã thêm, để giữ nguyên các thuộc tính kiểu chữ được đặt trước đó bạn có thể sử dụng:

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

14
nó nên làtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin để giữ phông chữ được đặt trước đó bạn cần sử dụng nó như thế này.
Sankar V

Đã chỉnh sửa câu trả lời của tôi dựa trên nhận xét @SankarV.
Raz

13
Tôi nghĩ bạn nên mất DEFAULT: chủ sở hữu.title.setTypeface (chủ sở hữu.title.getTypeface (), typeface.BOLD);
Iman Akbari

Thật ra textview.getTypeface().getStyle()android:textStyle
Pierre

126

Giả sử bạn có một kiểu được gọi là RedHUGEText trên các giá trị / style.xml của bạn:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

Chỉ cần tạo TextView của bạn như bình thường trong tệp bố cục XML / tệp your_layout.xml, giả sử:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

Và trong mã java của Hoạt động của bạn, bạn làm điều này:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

Nó làm việc cho tôi! Và nó đã áp dụng màu sắc, kích thước, trọng lực, v.v. Tôi đã sử dụng nó trên thiết bị cầm tay và máy tính bảng có Cấp độ API Android từ 8 đến 17 mà không gặp vấn đề gì. Lưu ý rằng kể từ Android 23, phương pháp đó đã không được chấp nhận. Đối số ngữ cảnh đã bị loại bỏ, vì vậy dòng cuối cùng sẽ cần phải là:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Hãy nhớ rằng ... điều này chỉ hữu ích nếu kiểu văn bản thực sự phụ thuộc vào một điều kiện trên logic Java của bạn hoặc bạn đang xây dựng giao diện người dùng "nhanh chóng" bằng mã ... nếu không, tốt hơn là chỉ nên làm:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

Bạn luôn có thể có nó theo cách của bạn!


4
Điều này sẽ chỉ đặt một tập hợp con các thuộc tính có thể được xác định trong <style>thẻ. Nó thực hiện những cái phổ biến (kích thước, màu sắc, kiểu dáng), nhưng không áp dụng những cái khác (bao gồm cả đệm, nền, trọng lực, v.v.)
karl

5
Có vẻ cần API tối thiểu 23?
William T. Mallard

4
có hai phương pháp, một cho api <23 và một cho api 23+. Chúng xuất hiện giống hệt nhau ngoại trừ một đối với <23 có một đối số ngữ cảnh và một đối tượng cho 23+ thì không. Dưới mui xe, một cho api 23+ gọi phương thức cho <23 và sử dụng bối cảnh thành viên cho chế độ xem văn bản.
MrPlow


52

Vì vậy, nhiều cách để đạt được nhiệm vụ này một số dưới đây: -

1.

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2.

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3.

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4.

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

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

hoặc nếu bạn muốn thông qua xml

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

setTextAppparent () là câu trả lời tôi đã có sau để áp dụng một kiểu tùy chỉnh được xác định trong XML của tôi. Cảm ơn.
ashario

Theo tôi, đây là câu trả lời tốt nhất cho chủ đề. Nhiều tùy chọn để gọi mã theo chương trình
Nguyễn Minh Hiển

9

Kotlin Version

Để giữ lại phông chữ hiện tại ngoài kiểu văn bản:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}

7

Câu hỏi này được hỏi ở rất nhiều nơi theo nhiều cách khác nhau. Ban đầu tôi đã trả lời nó ở đây nhưng tôi cảm thấy nó cũng có liên quan trong chủ đề này (vì tôi đã kết thúc ở đây khi tôi đang tìm kiếm một câu trả lời).

Không có giải pháp một dòng cho vấn đề này, nhưng điều này đã làm việc cho trường hợp sử dụng của tôi. Vấn đề là, hàm tạo 'View (bối cảnh, attrs, defStyle)' không đề cập đến một kiểu thực tế, nó muốn một thuộc tính. Vì vậy, chúng tôi sẽ:

  1. Xác định một thuộc tính
  2. Tạo một phong cách mà bạn muốn sử dụng
  3. Áp dụng một kiểu cho thuộc tính đó vào chủ đề của chúng tôi
  4. Tạo phiên bản mới của quan điểm của chúng tôi với thuộc tính đó

Trong 'res / value / attrs.xml', xác định một thuộc tính mới:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

Trong res / value / style.xml 'Tôi sẽ tạo kiểu tôi muốn sử dụng trên TextView tùy chỉnh của mình

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

Trong 'res / value / Themes.xml' hoặc 'res / value / Styles.xml', sửa đổi chủ đề cho ứng dụng / hoạt động của bạn và thêm kiểu sau:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Cuối cùng, trong TextView tùy chỉnh của bạn, bây giờ bạn có thể sử dụng hàm tạo với thuộc tính và nó sẽ nhận được kiểu của bạn

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Điều đáng chú ý là tôi liên tục sử dụng customTextView trong các biến thể khác nhau và các địa điểm khác nhau, nhưng không có cách nào để tên của chế độ xem khớp với kiểu hoặc thuộc tính hoặc bất cứ thứ gì. Ngoài ra, kỹ thuật này sẽ hoạt động với bất kỳ chế độ xem tùy chỉnh nào, không chỉ TextViews.


5

Điều này làm việc cho tôi

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

hoặc là

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

Tôi đã giải quyết nó bằng hai phương pháp đơn giản.

Thực hiện theo lời giải thích.

Tuyên bố phong cách hiện có của tôi:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

Mã Java Android của tôi:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

Trân trọng.


0

Bạn có thể thử cái này

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }

0

setTextAppearance(resId)chỉ có sẵn cho API 23 trở lên, hãy sử dụng:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Phương pháp này được thực hiện trong nội bộ như sau:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}

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.