क्रमबद्ध रूप से TextView के लिए शैली सेट करें


249

मैं TextViewइस तरह से स्टाइल के साथ कंस्ट्रक्टर का उपयोग करने की कोशिश कर रहा हूं :

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

हालाँकि, जब मैं ऐसा करता हूं, तो पाठ दृश्य शैली लेने के लिए प्रकट नहीं होता है (मैंने एक स्थिर ऑब्जेक्ट पर सेट करके शैली को सत्यापित किया है)।

मैं भी उपयोग करने की कोशिश की है, myText.setTextAppearance(MyActivity.this, R.style.my_style)लेकिन यह भी काम नहीं करता है।

जवाबों:


318

मुझे विश्वास नहीं है कि आप शैली को प्रोग्रामेटिक रूप से सेट कर सकते हैं। इसके आस-पास पाने के लिए आप असाइन की गई शैली के साथ एक टेम्पलेट लेआउट xml फ़ाइल बना सकते हैं, उदाहरण के लिए res / लेआउट में निम्न सामग्री के साथ tvtemplate.xml बनाएं:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

इसके बाद अपने नए टेक्स्ट दृश्य को तुरंत बढ़ाने के लिए इसे फुलाएँ:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

उम्मीद है की यह मदद करेगा।


1
जहां यह Dandre Allison के जवाब पर जीतता है कि उसे API v11 की आवश्यकता नहीं है।
मार्टिन कैपोडिसी

2
यह काम किया हो सकता है, लेकिन इसका कोई मतलब नहीं है। यह संभवतः xml फ़ाइल के साथ कैसे सेट किया जा सकता है? यदि प्रोग्रामेटिक रूप से नहीं । Xml फ़ाइलों का उपयोग न करने के कारण हैं, उनमें से एक है मैं यूआई बनाने के लिए कोड लिखने के लिए उपयोग किया जाता हूं इसलिए मैं इसे करने का एक नया तरीका नहीं सीखना चाहता क्योंकि मेरी मेमोरी सीमित है और मैं कुछ कमरे रखना चाहता हूं अन्य बातें।
इरोब अल असिमी

@IharobAlAsimi यह सही है, सभी चीजों को प्रोग्रामेटिक रूप से किया जा सकता है, और लेआउटइन्फ्लैटर XML को ऑब्जेक्ट्स में बदलने के बारे में सब कुछ जानता है। अफसोस की बात है, ऐसी कई चीजें निजी एपीआई के तहत छिपी हुई हैं, और कुछ वस्तुओं को बनाने का एकमात्र तरीका कंस्ट्रक्टर को एट्रीब्यूटसेट की आपूर्ति कर रहा है।
Miha_x64

अन्य सभी उत्तरों के विपरीत, यह वास्तव में स्पिनरों के साथ आपके लिए एक सोने का तारा है
रोवन बेरी

121

आप एक सामान्य शैली बना सकते हैं और इसे नीचे दिए गए जैसे कई टेक्स्ट साक्षात्कार पर फिर से उपयोग कर सकते हैं:

textView.setTextAppearance(this, R.style.MyTextStyle);

संपादित करें: यह संदर्भ को संदर्भित करता है


50
आपका उत्तर तब तक काम करता है जब तक आपका सभी पाठ की "शैली" के साथ बंदर कर रहा हो। यदि आप टेक्स्टव्यू में अन्य चीजें करने की कोशिश कर रहे हैं तो यह काम नहीं करता है जैसे पैडिंग या मार्जिन जोड़ना। इसलिए, मैं यह नहीं कह रहा कि आप गलत हैं, लेकिन आपका जवाब सीमित है। रनटाइम पर दृश्य को उत्तेजित करना एक व्यापक शैली को लागू करने का एकमात्र तरीका है।
बिल मोटे

1
फुलाया हुआ टेम्पलेट का उपयोग करने और सेटटेक्स्टपैरेंस का उपयोग करने के दोनों समाधान उचित हैं। दूसरे समाधान के लिए पैडिंग / मार्जिन मुद्दे को संबोधित करने के लिए आप textView.setLayoutParams (LayoutParams) को कॉल कर सकते हैं
AlanKley

इस विधि को एपीआई स्तर 23 में पदावनत किया गया था। एपीआई 23+ के बजाय सेटटेक्स्टपियरेंस (इंट) का उपयोग करें।
सर्जेई

सुनिश्चित करें कि संस्करण कम से कम API 23 (M)
Br0thazS0ul

4
समर्थन पुस्तकालय से विधि का उपयोग करें,TextViewCompat.setTextAppearance
रुबिन यू

97

आप इस तरह से कंस्ट्रक्टर को एक ContextThemeWrapper पास कर सकते हैं :

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));

1
उत्तम सामग्री! जिस तरह से मैं एपीआई 8. का समर्थन करते हुए प्रोग्राम को
शैलीगत रूप से

किसी कारण से, यह मेरे बटन की शैली को प्रभावित नहीं करता है। मैं की तरह मेरी शैली को परिभाषित किया है: <style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>। और फिर मैं इसे एक निर्माण के साथ आह्वान करता हूं new Button(new ContextThemeWrapper(context, R.style.TabButton));:। लेकिन बटन बस मेरी सेटिंग्स को नजरअंदाज करता है। क्या मैं यहाँ कुछ गलत कर रहा हूँ?
एलेक्स एन।

@ AlaksiejN.You को विजेट से विरासत में मिलना चाहिए। बट्टन शैली इस तरह से हैparent="@android:style/Widget.Button"
maxcanna

@ maxcanna किसी कारण से जोड़ने से parentथोड़ा बदलाव नहीं हुआ। इसलिए मैं अभी inflateसमाधान के साथ आगे बढ़ा ।
एलेक्स एन।

11
@AliakseiN। आपको 3-आरजी कंस्ट्रक्टर का उपयोग करने की आवश्यकता है, उदाहरण के लिए new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)। अन्यथा, डिफ़ॉल्ट बटन शैली को लागू किया जाएगा, और यह शैली उस बटन शैली को ओवरराइड कर देगी जिसे आपने प्रसंग में ContextThemeWrapper के माध्यम से मर्ज किया है।
न्यूटनएक्स

17

आप शैली को कंस्ट्रक्टर में सेट कर सकते हैं (लेकिन शैलियों को गतिशील रूप से नहीं बदला / सेट किया जा सकता है)।

View(Context, AttributeSet, int)( intवर्तमान विषय में एक विशेषता है जिसमें एक शैली का संदर्भ है)

रोमेन गाइ का जवाब

संदर्भ


आपका जवाब भ्रामक है - क्या आपने इस धागे को अंत तक पढ़ने की कोशिश की है?
andr

3
यह कैसे गुमराह होता है? स्वीकृत उत्तर भ्रामक है, क्योंकि रोमेन गाइ स्पष्ट रूप से कहते हैं कि आप एक शैली को प्रोग्रामेटिक रूप से "सेट" कर सकते हैं। बस इसे गतिशील रूप से बदलने की सुविधा नहीं है। यह धागा लगता नहीं है कि हालांकि मामला है।
डांड्रे एलिसन

1
खबरदार, इस कॉल के लिए एपीआई स्तर 11.
मार्टिन कैपोडिसी

1
@PaVVerest यह कोई उद्धरण नहीं है।
डांड्रे एलिसन

6
अंतिम int एक शैली संसाधन नहीं है। यह "वर्तमान विषय में एक विशेषता है जिसमें एक शैली संसाधन का संदर्भ है जो दृश्य के लिए डिफ़ॉल्ट मानों की आपूर्ति करता है।"
rve

11

पैरामीटर int defStyleAttrशैली निर्दिष्ट नहीं करता है। Android प्रलेखन से:

defStyleAttr - वर्तमान विषय में एक विशेषता जिसमें एक शैली संसाधन का संदर्भ होता है जो दृश्य के लिए डिफ़ॉल्ट मानों की आपूर्ति करता है। चूक के लिए नहीं देख सकते 0 हो सकता है।

व्यू कंस्ट्रक्टर में स्टाइल सेट करने के लिए हमारे पास 2 संभावित उपाय हैं:

  1. ContextThemeWrapper के उपयोग के साथ:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
  2. चार-तर्क निर्माण (LOLLIPOP से उपलब्ध) के साथ:

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);

दोनों समाधानों के लिए मुख्य बात - defStyleAttrहमारी शैली को देखने के लिए लागू करने के लिए पैरामीटर 0 होना चाहिए।


5

डायनामिक रूप से बदलती शैलियों का समर्थन नहीं किया जाता है (अभी तक)। एक्सएमएल के माध्यम से व्यू बनाए जाने से पहले आपको स्टाइल सेट करना होगा ।


20
जो वास्तव में एक ही चीज होती है, वह है
njzk2

@ njzk2 धन्यवाद ... स्पष्ट रूप से पोस्ट करने से पहले उनकी टिप्पणी के बारे में नहीं सोचा था। यूआई निर्मित होने से पहले प्रोग्राम को स्टाइल से सेट करने का कोई तरीका नहीं है, इस प्रकार एक ही कोड को प्रोग्राम को प्रोग्राम को बदलने या सेट करने के लिए उपयोग किया जाएगा।
क्रिस कैशवेल

3

स्वीकृत उत्तर मेरे लिए बहुत अच्छा था। जोड़ने की एकमात्र inflate()विधि विधि के बारे में है।

स्वीकृत उत्तर में सभी android:layout_*मापदंडों को लागू नहीं किया जाएगा।

कारण इसे समायोजित करने का कोई तरीका नहीं है, कारण के nullरूप में पारित किया गया था ViewGroup parent

आप इसे इस तरह से उपयोग कर सकते हैं:

View view = inflater.inflate(R.layout.view, parent, false);

और वह parentहै ViewGroup, जहां से आप को समायोजित करना पसंद है android:layout_*

इस मामले में, सभी सापेक्ष गुण सेट किए जाएंगे।

आशा है कि यह किसी के लिए उपयोगी होगा।


2

कस्टम दृश्य का उपयोग करते समय जो स्टाइल इनहेरिटेंस (या ईवेंट स्टाइल करने योग्य विशेषताएँ) का उपयोग कर सकता है, आपको स्टाइल को न खोने के लिए दूसरे कंस्ट्रक्टर को संशोधित करना होगा। यह मेरे लिए काम करने की जरूरत है, बिना setTextAppearence () का उपयोग करने के लिए :

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

2

मैं समस्या से भी मिला, और मुझे शैली को प्रोग्रामेटिक रूप से सेट करने का तरीका मिला। शायद आप सभी को इसकी आवश्यकता है, इसलिए मैं वहां अपडेट करता हूं।

व्यू कंस्ट्रक्टर का तीसरा पैराम नीचे दिए गए स्रोत कोड के रूप में आपकी थीम में एक प्रकार का अटर स्वीकार करता है:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

इसलिए आपको R.str के बजाय एक प्रकार का R.attr। ** पास करना होगा। **

मेरे कोड में, मैंने निम्नलिखित कदम उठाए:

सबसे पहले, attr.xml में थीम द्वारा उपयोग की जाने वाली एक अनुकूलित पोशाक को अनुकूलित करें।

<attr name="radio_button_style" format="reference" />

दूसरा, style.xml में अपने उपयोग किए गए विषय में अपनी शैली को विशिष्ट बनाएं।

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

अंत में, इसका उपयोग करें!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

प्रोग्राम बनाया गया दृश्य आपके विषय में निर्दिष्ट शैली का उपयोग करेगा।

आपके पास एक कोशिश हो सकती है, और आशा है कि यह आपके लिए पूरी तरह से काम कर सकती है।


0

मैंने केवल EditText के साथ परीक्षण किया है लेकिन आप विधि का उपयोग कर सकते हैं

सार्वजनिक शून्य सेटबैकग्राउंड। सोर्स (इंट रेज)

XML फ़ाइल में परिभाषित शैली लागू करने के लिए।

साइन इस विधि को देखने के लिए मेरा मानना ​​है कि यह किसी भी UI तत्व के साथ काम करेगा।

सादर।


दस्तावेज़ीकरण के अनुसार यह केवल ड्रॉबल्स के साथ काम करना चाहिए, स्टाइल के साथ नहीं। इस प्रकार, अगर यह वास्तव में काम करता है, तो यह केवल "दुर्घटना से" है और आपको इस पर भरोसा नहीं करना चाहिए।
हेनजी

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