การตั้งค่าสไตล์ส่วนกลางสำหรับมุมมองใน Android


125

สมมติว่าผมต้องการทุกTextViewกรณีใน app textColor="#ffffff"ของฉันจะมี มีวิธีตั้งค่าในที่เดียวแทนที่จะตั้งค่าสำหรับแต่ละรายการTextViewหรือไม่?


1
ฉันได้อัปเดตคำถามเพื่อให้สมบูรณ์ยิ่งขึ้น
Cristian

ฉันกำลังทำอะไรบางอย่างที่คล้ายกันที่นี่ !!! stackoverflow.com/questions/17103894/…
toobsco42

คำตอบ:


250

จริงๆแล้วคุณสามารถตั้งค่าสไตล์เริ่มต้นสำหรับ TextViews (และวิดเจ็ตในตัวอื่น ๆ ส่วนใหญ่) โดยไม่จำเป็นต้องทำคลาส java แบบกำหนดเองหรือตั้งค่าสไตล์ทีละรายการ

หากคุณดูในthemes.xmlซอร์ส Android คุณจะเห็นแอตทริบิวต์มากมายสำหรับสไตล์เริ่มต้นสำหรับวิดเจ็ตต่างๆ คีย์คือแอตทริบิวต์textViewStyle(หรือeditTextStyleฯลฯ ) ที่คุณแทนที่ในธีมที่คุณกำหนดเอง คุณสามารถลบล้างสิ่งเหล่านี้ได้ด้วยวิธีต่อไปนี้:

สร้าง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>

จากนั้นใช้ธีมนั้นกับแอปพลิเคชันของคุณในAndroidManifest.xml:

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

และมุมมองข้อความทั้งหมดของคุณจะเริ่มต้นเป็นสไตล์ที่กำหนดไว้MyTextViewStyle(ในกรณีนี้คือตัวหนาและสีแดง)!

สิ่งนี้ได้รับการทดสอบบนอุปกรณ์ตั้งแต่ระดับ API 4 เป็นต้นไปและดูเหมือนว่าจะใช้งานได้ดี


1
ทางออกที่สง่างามที่สุดที่ฉันเห็นจนถึงตอนนี้
Italo Borssatto

@Steve ถ้าฉันรวมไอเท็ม<item name="android:textViewStyle">@style/MyTextViewStyle</item>ในสไตล์ MyTheme แล้วใช้สไตล์กับแอปพลิเคชันของฉันTextViews ทั้งหมดของฉันจะแสดงตามสไตล์ (แม้แต่ชื่อแอพพลิเคชั่นในแถบการทำงาน) จะแก้ไขปัญหาด้วยแถบการดำเนินการได้อย่างไร? ฉันต้องการให้มีลักษณะเริ่มต้น Github
Maksim Dmitriev

@Steve วิธีใช้ทั้ง (แถบการกระทำและวิดเจ็ต) ในแอปพลิเคชัน
Pratik Butani

ฉันไม่แน่ใจเกี่ยวกับวิธีแยกความแตกต่างของ ActionBar จากสิ่งอื่น ๆ คุณอาจสามารถค้นหาได้ทุกที่สไตล์ ActionBar ของคุณแล้ววางไว้ที่<item name="android:textViewStyle">@style/MyTextViewStyle</item>นั่นด้วยเพียงแค่ชี้ไปที่ค่าเริ่มต้น ActionBar (หรือสิ่งที่คล้ายกัน)
Steve Pomeroy

@StevePomeroy สิ่งนี้ใช้ไม่ได้สำหรับฉัน .. คุณสามารถให้การสนับสนุนบางส่วน สไตล์ของฉันสำหรับ TextViews ยังคงเหมือนเดิม มีรายการขั้นต่ำที่ฉันต้องตั้งหรือมีบางรายการที่ฉันไม่ได้รับอนุญาตให้ตั้งค่าหรือไม่?
Mike

52

มีสองวิธีในการดำเนินการ:

1. การใช้รูปแบบ

คุณสามารถกำหนดสไตล์ของคุณเองได้โดยการสร้างไฟล์ XML บนres/valuesไดเร็กทอรี สมมติว่าคุณต้องการมีข้อความสีแดงและตัวหนาจากนั้นสร้างไฟล์ที่มีเนื้อหานี้:

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

res/values/red.xmlคุณสามารถตั้งชื่อมันเหมือนคุณต้องการตัวอย่างเช่น จากนั้นสิ่งเดียวที่คุณต้องทำคือใช้มุมมองนั้นในวิดเจ็ตที่คุณต้องการตัวอย่างเช่น:

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

สำหรับข้อมูลอ้างอิงเพิ่มเติมคุณสามารถอ่านบทความนี้: การทำความเข้าใจธีมและสไตล์ของ Android

2. การใช้คลาสที่กำหนดเอง

นี่เป็นอีกวิธีหนึ่งที่เป็นไปได้ในการบรรลุเป้าหมายนี้และจะให้คุณTextViewกำหนดสีข้อความตามที่คุณต้องการเสมอ ตัวอย่างเช่น:

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

จากนั้นคุณต้องปฏิบัติตามปกติTextViewในไฟล์ XML ของคุณ:

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

ไม่ว่าคุณจะใช้ทางเลือกใดทางเลือกหนึ่งขึ้นอยู่กับความต้องการของคุณ หากสิ่งเดียวที่คุณต้องการทำคือการปรับเปลี่ยนรูปลักษณ์แนวทางที่ดีที่สุดคือสิ่งแรก ในทางกลับกันหากคุณต้องการเปลี่ยนรูปลักษณ์และเพิ่มฟังก์ชันใหม่ ๆ ให้กับวิดเจ็ตของคุณอันที่สองคือหนทางที่จะไป


ควรใช้คลาสแบบกำหนดเองเนื่องจากเป็นแนวทางที่สะอาดกว่าและช่วยให้ไฟล์ xml มีน้ำหนักเบา
Amit Kumar

@AmitKumar ไม่ควร! ในกรณีนี้จะหมายถึงการใช้คลาสที่กำหนดเองแยกต่างหากสำหรับแต่ละค่าแอตทริบิวต์ที่แตกต่างกัน สิ่งนี้สร้างโค้ด bloat จำนวนมากและทำให้ไม่สามารถอ่านเค้าโครงจริงได้อีกต่อไป (คุณจะต้องไปที่แต่ละชั้นเรียนเพื่อดูว่ามันทำอะไรแทนที่จะอ่านเพียงไม่กี่บรรทัด xml) ควรใช้คลาสที่กำหนดเองก็ต่อเมื่อคุณปรับเปลี่ยนลักษณะการทำงาน แต่ไม่ใช่ถ้าการเปลี่ยนแปลงเพียงอย่างเดียวคือรูปลักษณ์ของมุมมอง
Andre

เป็นไปไม่ได้ที่จะตั้งค่ารูปแบบของมุมมองแบบกำหนดเองจาก xml? ทำไมเราถึงใช้ในcustom_view_layout.xmlไฟล์ที่ใช้ขยายคลาสที่กำหนดเองไม่ได้
lucidbrot

5

สำหรับสีข้อความเริ่มต้นTextViewให้ตั้งค่าandroid:textColorTertiaryในธีมของคุณเป็นสีที่ต้องการ:

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

สีอื่น ๆ ของการควบคุม Android สามารถควบคุมได้โดยใช้แอตทริบิวต์ของเฟรมเวิร์กหรือรองรับแอตทริบิวต์ไลบรารีหากคุณใช้ไลบรารีสนับสนุน

สำหรับรายการแอตทริบิวต์ที่คุณสามารถตั้งค่าได้ให้ตรวจสอบซอร์สโค้ด Androidของstyles.xmlและthemes.xmlหรือส่วนสำคัญที่เป็นประโยชน์นี้โดย Dan Lew ลองเปลี่ยนค่าแต่ละค่าและดูว่ามีการเปลี่ยนแปลงอย่างไรบนหน้าจอ


ขอบคุณผู้ชาย! ฉันใช้เวลามากมายในการหาสาเหตุที่ textColorPrimary ไม่ทำงาน
pratt

3

กำหนดสไตล์และใช้กับแต่ละวิดเจ็ตกำหนดธีมที่แทนที่ค่าเริ่มต้นของ Android สำหรับวิดเจ็ตนั้นหรือกำหนดทรัพยากรสตริงและอ้างอิงในแต่ละวิดเจ็ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.