Android में दृश्य के लिए वैश्विक शैलियों की स्थापना


125

मान लीजिए कि मैं चाहता हूं कि TextViewमेरे ऐप में सभी उदाहरण हैं textColor="#ffffff"। क्या प्रत्येक के लिए इसे स्थापित करने के बजाय एक जगह पर सेट करने का कोई तरीका है TextView?


1
मैंने अपना प्रश्न अपडेट कर दिया है, ताकि यह अधिक पूर्ण हो जाए।
क्रिस्टियन

मैं यहाँ कुछ ऐसा ही कर रहा हूँ !!! stackoverflow.com/questions/17103894/…
toobsco42

जवाबों:


250

वास्तव में, आप कस्टम जावा वर्ग या व्यक्तिगत रूप से शैली सेट करने की आवश्यकता के बिना TextViews (और अधिकांश अन्य अंतर्निहित विजेट) के लिए एक डिफ़ॉल्ट शैली सेट कर सकते हैं।

यदि आप themes.xmlएंड्रॉइड स्रोत में एक नज़र डालते हैं , तो आपको विभिन्न विजेट्स के लिए डिफ़ॉल्ट शैली के लिए विशेषताओं का एक गुच्छा दिखाई देगा। कुंजी वह 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(इस उदाहरण में, बोल्ड और लाल) में परिभाषित शैली के लिए डिफ़ॉल्ट होंगे !

यह एपीआई स्तर 4 से उपकरणों पर परीक्षण किया गया था और यह बहुत अच्छा काम करता है।


1
सबसे सुरुचिपूर्ण समाधान जो मैंने अब तक देखा था।
इटालो बोर्स्सटैटो

@ पहले, यदि मैं <item name="android:textViewStyle">@style/MyTextViewStyle</item>शैली में आइटम MyTheme को शामिल करता हूं और फिर शैली को अपने एप्लिकेशन पर लागू करता हूं, तो मेरे सभी TextViewएस स्टाइल के अनुसार दिखाए जाएंगे (यहां तक ​​कि एक्शन बार में एप्लिकेशन का नाम भी)। एक्शन बार के साथ मामले को कैसे ठीक करें? मैं चाहता हूं कि इसमें डिफ़ॉल्ट उपस्थिति हो। गितुब
दिमित्रीक

@Steve, आवेदन पर दोनों (एक्शन बार और विजेट) थीम कैसे लागू करें
प्रतीक बुटानी

मुझे यकीन नहीं है कि ActionBar को अन्य चीजों से कैसे अलग किया जाए। आप अपनी एक्शनबार शैली को जहां भी सेट <item name="android:textViewStyle">@style/MyTextViewStyle</item>कर सकते हैं, वहां ढूंढने में सक्षम हो सकते हैं और फिर वहां भी डाल सकते हैं, बस एक्शनबेर डिफॉल्ट (या कुछ इसी तरह) की ओर इशारा करते हुए
स्टीव पोमेरॉय

@StevePomeroy यह मेरे लिए काम नहीं करता है .. क्या आप कुछ सहायता प्रदान कर सकते हैं। TextViews के लिए मेरा स्टाइल वही रहता है। क्या कुछ आइटम हैं जिन्हें मुझे सेट करने की आवश्यकता है या क्या कुछ आइटम हैं जिन्हें मुझे सेट करने की अनुमति नहीं है?
माइक

52

ऐसा करने के दो तरीके हैं:

1. शैलियों का उपयोग करना

आप res/valuesडायरेक्टरी पर XML फाइलें बनाकर अपनी खुद की शैलियों को परिभाषित कर सकते हैं । तो, मान लें कि आप लाल और बोल्ड टेक्स्ट चाहते हैं, तो आप इस सामग्री के साथ एक फ़ाइल बनाएँ:

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

आगे के संदर्भ के लिए, आप इस लेख को पढ़ सकते हैं: एंड्रॉइड थीम और शैलियों को समझना

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 फ़ाइल को हल्के वजन रखने में मदद करता है।
अमित कुमार

@AmitKumar नहीं उन्हें नहीं करना चाहिए! इस विशेष मामले में इसका मतलब प्रत्येक अलग विशेषता मान के लिए एक अलग कस्टम वर्ग का उपयोग करना होगा। यह बहुत सारे ब्लोट कोड का उत्पादन करता है और वास्तविक लेआउट को और अधिक पढ़ने योग्य नहीं बनाता है (आपको केवल कुछ xml लाइनों को पढ़ने के बजाय यह देखने के लिए प्रत्येक कक्षा पर जाना होगा कि यह क्या कर रहा है)। कस्टम क्लासेस का उपयोग केवल तभी किया जाना चाहिए यदि आप व्यवहार को संशोधित करते हैं, लेकिन ऐसा नहीं है कि केवल परिवर्तन ही दृश्य का रूप है।
आंद्रे

क्या xml से कस्टम दृश्य की शैली सेट करना संभव नहीं है? हम उस custom_view_layout.xmlफ़ाइल में इसका उपयोग क्यों नहीं कर सकते हैं जो कस्टम क्लास को फुलाए जाने के लिए उपयोग की जाती है?
ल्यूसिडब्रॉट

5

डिफ़ॉल्ट पाठ रंग में TextView, android:textColorTertiaryइच्छित रंग में अपने विषय में सेट करें:

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

यदि आप समर्थन पुस्तकालय का उपयोग करते हैं, तो कई अन्य एंड्रॉइड नियंत्रणों के रंगों को फ्रेमवर्क विशेषताओं, या लाइब्रेरी विशेषताओं का उपयोग करके नियंत्रित किया जा सकता है।

गुण आप सेट कर सकते हैं की एक सूची के लिए, बाहर की जाँच एंड्रॉयड स्रोत कोड की styles.xmlऔर themes.xml, या इस बहुत उपयोगी सार दान ल्यू से, प्रत्येक मान बदलने का प्रयास करें और वे क्या स्क्रीन पर बदल देखें।


श्रीमान धन्यवाद! मैंने समय का एक समूह बिताया है कि क्यों TextColorPrimary काम नहीं करता है।
प्रात:

3

एक शैली को परिभाषित करें और प्रत्येक विजेट पर इसका उपयोग करें, एक थीम को परिभाषित करें जो उस विजेट के लिए एंड्रॉइड डिफ़ॉल्ट को ओवरराइड करता है, या एक स्ट्रिंग संसाधन को परिभाषित करता है और प्रत्येक विजेट में इसे संदर्भित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.