Đặt kiểu toàn cầu cho Chế độ xem trong Android


125

Hãy nói rằng tôi muốn tất cả các TextViewphiên bản trong ứng dụng của tôi có textColor="#ffffff". Có cách nào để đặt nó ở một nơi thay vì đặt nó cho mỗi nơi TextViewkhông?


1
Tôi đã cập nhật câu hỏi của mình để nó được hoàn thiện hơn.
Cristian

Tôi đang làm một cái gì đó tương tự TẠI ĐÂY !!! stackoverflow.com/questions/17103894/
Mạnh

Câu trả lời:


250

Trên thực tế, bạn có thể đặt kiểu mặc định cho TextViews (và hầu hết các widget tích hợp khác) mà không cần phải thực hiện một lớp java tùy chỉnh hoặc đặt kiểu riêng lẻ.

Nếu bạn xem trong themes.xmlnguồn Android, bạn sẽ thấy một loạt các thuộc tính cho kiểu mặc định cho các vật dụng khác nhau. Chìa khóa là thuộc tính textViewStyle(hoặc editTextStyle, v.v.) mà bạn ghi đè trong chủ đề tùy chỉnh của mình. Bạn có thể ghi đè những thứ này theo cách sau:

Tạo một styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
</style>
</resources>

Sau đó, chỉ cần áp dụng chủ đề đó cho ứng dụng của bạn trong AndroidManifest.xml:

<application […] android:theme="@style/MyTheme">

Và tất cả các chế độ xem văn bản của bạn sẽ mặc định theo kiểu được xác định trong MyTextViewStyle(trong trường hợp này là đậm và đỏ)!

Điều này đã được thử nghiệm trên các thiết bị từ API cấp 4 trở đi và dường như hoạt động rất tốt.


1
Các giải pháp thanh lịch nhất mà tôi thấy cho đến bây giờ.
Italo Borssatto

@Steve, nếu tôi bao gồm mục <item name="android:textViewStyle">@style/MyTextViewStyle</item>theo kiểu MyTheme và sau đó áp dụng kiểu cho ứng dụng của mình, tất cả các mục của tôi TextViewsẽ được hiển thị theo kiểu (thậm chí tên của ứng dụng trong thanh hành động). Làm thế nào để khắc phục vấn đề với thanh hành động? Tôi muốn nó có sự xuất hiện mặc định. Github
Maksim Dmitriev

@Steve, Cách áp dụng cả chủ đề (thanh hành động và widget) trên ứng dụng
Pratik Butani

Tôi không chắc chắn về cách phân biệt ActionBar với những thứ khác. Bạn có thể tìm thấy bất cứ nơi nào kiểu ActionBar của bạn được đặt và sau đó cũng được đặt <item name="android:textViewStyle">@style/MyTextViewStyle</item>ở đó, chỉ cần trỏ đến mặc định ActionBar (hoặc một cái gì đó tương tự)
Steve Pomeroy

@StevePomeroy điều này không hiệu quả với tôi .. bạn có thể cung cấp một số Hỗ trợ. Phong cách của tôi cho TextViews vẫn giữ nguyên. Có tối thiểu các mục tôi cần đặt hoặc có một số mục tôi không được phép đặt không?
Mike

52

Có hai cách để làm như vậy:

1. Sử dụng phong cách

Bạn có thể xác định kiểu của riêng mình bằng cách tạo tệp XML trên res/valuesthư mục. Vì vậy, giả sử bạn muốn có văn bản màu đỏ và đậm, sau đó bạn tạo một tệp có nội dung này:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyRedTheme" parent="android:Theme.Light">
    <item name="android:textAppearance">@style/MyRedTextAppearance</item>
  </style>
  <style name="MyRedTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
  </style>
</resources>

Bạn có thể đặt tên như bạn muốn, ví dụ res/values/red.xml. Sau đó, điều duy nhất bạn phải làm là sử dụng chế độ xem đó trong các tiện ích mà bạn muốn, ví dụ:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    style="@style/MyRedTheme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Để tham khảo thêm, bạn có thể đọc bài viết này: Tìm hiểu về Chủ đề và Kiểu Android

2. Sử dụng các lớp tùy chỉnh

Đây là một cách khả thi khác để đạt được điều này và nó sẽ là cung cấp cho riêng bạn TextViewthiết lập màu văn bản luôn theo bất cứ thứ gì bạn muốn; ví dụ:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
public class RedTextView extends TextView{
    public RedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTextColor(Color.RED);
    }
}

Sau đó, bạn chỉ cần coi nó như một bình thường TextViewtrong tệp XML của mình:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.example.RedTextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Cho dù bạn sử dụng một hay một lựa chọn khác tùy thuộc vào nhu cầu của bạn. Nếu điều duy nhất bạn muốn làm là sửa đổi ngoại hình, thì cách tiếp cận tốt nhất là cách đầu tiên. Mặt khác, nếu bạn muốn thay đổi giao diện và thêm một số chức năng mới vào các vật dụng của mình, thì thứ hai là cách để đi.


sử dụng các lớp tùy chỉnh nên được ưu tiên vì đó là cách tiếp cận sạch hơn và giúp giữ trọng lượng tệp xml nhẹ.
Amit Kumar

@AmitKumar Không họ không nên! Trong trường hợp cụ thể này, điều này có nghĩa là sử dụng một lớp tùy chỉnh riêng cho từng giá trị thuộc tính khác nhau. Điều này tạo ra rất nhiều mã phình và làm cho bố cục thực tế không thể đọc được nữa (bạn sẽ phải truy cập từng lớp để xem những gì nó đang làm thay vì chỉ đọc vài dòng xml). Các lớp tùy chỉnh chỉ nên được sử dụng nếu bạn sửa đổi hành vi, nhưng không phải nếu thay đổi duy nhất là giao diện của khung nhìn.
Andre

Có thể không đặt kiểu của chế độ xem tùy chỉnh từ xml không? Tại sao chúng ta không thể sử dụng nó trong custom_view_layout.xmltệp được sử dụng để tăng một lớp tùy chỉnh?
lucidbrot

5

Đối với màu văn bản mặc định trong TextView, đặt android:textColorTertiarytrong chủ đề của bạn thành màu mong muốn:

<item name="android:textColorTertiary">@color/your_text_color</item>

Nhiều màu sắc của điều khiển Android khác có thể được kiểm soát bằng các thuộc tính khung hoặc thuộc tính thư viện hỗ trợ nếu bạn sử dụng thư viện hỗ trợ.

Đối với một danh sách các thuộc tính mà bạn có thể thiết lập, hãy kiểm tra mã nguồn Android của styles.xmlthemes.xml, hoặc rất hữu ích này ý chính bởi Dan Lew, hãy thử thay đổi mỗi giá trị và xem những gì họ thay đổi trên màn hình.


Cảm ơn bạn! Tôi đã dành rất nhiều thời gian để tìm hiểu tại sao textColorPrimary không hoạt động.
pratt

3

Xác định một kiểu và sử dụng nó trên mỗi widget, xác định một chủ đề ghi đè mặc định android cho widget đó hoặc xác định tài nguyên chuỗi và tham chiếu nó trong mỗi widget

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.