कैसे style.xml से प्रोग्राम विशेषताओं को पुनः प्राप्त करने के लिए


82

वर्तमान में मैं अपने एक ऐप में एक वेबसर्वर से आने वाले कुछ डायनामिक डेटा को दिखाने के लिए या तो एक वेब व्यू या एक टेक्स्ट व्यू का उपयोग कर रहा हूं। यदि डेटा में शुद्ध पाठ है, तो यह TextView का उपयोग करता है और स्टाइल से शैली लागू करता है। xml। यदि डेटा में HTML (अधिकतर पाठ और चित्र) हैं तो यह WebView का उपयोग करता है।

हालाँकि, यह WebView अस्थिर है। वहाँ यह सामान्य TextView से बहुत अलग दिखता है। मैंने पढ़ा है कि किसी HTML में डेटा को सीधे डेटा में डालकर टेक्स्ट को स्टाइल करना संभव है। यह काफी आसान लगता है, लेकिन मैं इस HTML में आवश्यक मानों के रूप में अपनी Styles.xml से डेटा का उपयोग करना चाहूंगा, इसलिए मुझे अपनी शैली बदलने पर दो स्थानों पर रंग वगैरह को बदलने की आवश्यकता नहीं होगी।

तो, मैं यह कैसे कर पाऊंगा? मैंने कुछ व्यापक खोज की है, लेकिन मुझे वास्तव में आपकी शैलियों से अलग शैली विशेषताओं को पुनः प्राप्त करने का कोई तरीका नहीं मिला है। क्या मुझे यहाँ कुछ याद आ रहा है या इन मूल्यों को पुनः प्राप्त करना वास्तव में संभव नहीं है?

मैं जिस शैली से डेटा प्राप्त करने की कोशिश कर रहा हूं वह निम्नलिखित है:

<style name="font4">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">#E3691B</item>
    <item name="android:paddingLeft">5dp</item>
    <item name="android:paddingRight">10dp</item>
    <item name="android:layout_marginTop">10dp</item>
    <item name="android:textStyle">bold</item>
</style>

मैं मुख्य रूप से TextSize और textColor में रुचि रखता हूं।


आप केवल XML (जैसे Android का SAX पार्सर) को पार्स क्यों नहीं करते हैं?
m0skit0

जवाबों:


177

styles.xmlप्रोग्राम शैली से कस्टम शैलियों को पुनः प्राप्त करना संभव है ।

कुछ मनमानी शैली को परिभाषित करें styles.xml:

<style name="MyCustomStyle">
    <item name="android:textColor">#efefef</item>
    <item name="android:background">#ffffff</item>
    <item name="android:text">This is my text</item>
</style>

अब, इस तरह की शैलियों को पुनः प्राप्त करें

// The attributes you want retrieved
int[] attrs = {android.R.attr.textColor, android.R.attr.background, android.R.attr.text};

// Parse MyCustomStyle, using Context.obtainStyledAttributes()
TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, attrs);

// Fetch the text from your style like this.     
String text = ta.getString(2);

// Fetching the colors defined in your style
int textColor = ta.getColor(0, Color.BLACK);
int backgroundColor = ta.getColor(1, Color.BLACK);

// Do some logging to see if we have retrieved correct values
Log.i("Retrieved text:", text);
Log.i("Retrieved textColor as hex:", Integer.toHexString(textColor));
Log.i("Retrieved background as hex:", Integer.toHexString(backgroundColor));

// OH, and don't forget to recycle the TypedArray
ta.recycle()

बहुत बढ़िया काम दोस्त। कहा जा रहा है (और इसे बहुत पढ़ने के बाद) कि यह नहीं किया जा सकता है, आपने पूरी तरह से यह दिखाया है। बस इसे आज़माया और मैं अपनी शैली से फ़ॉन्ट रंग प्राप्त करने में सक्षम था। अभी तक काफी ग्रंथ नहीं मिल सकता है लेकिन मैं इसका पता लगाऊंगा। जैसे ही मैं इनाम (अब से 18 घंटे) भेज सकता हूं, 100 अंक आपके रास्ते में आ रहे हैं। आपका बहुत बहुत धन्यवाद!
सैंडर

4
क्या यह उन मूल्यों को बदलना भी संभव है जो रन समय में शैली में परिभाषित किए गए हैं?
ekjyot

क्या होगा अगर मैं पुनः प्राप्त विशेषताओं का रंग बदलना चाहता हूं? इस कोड के भीतर पृष्ठभूमि या पाठ रंग को गतिशील रूप से बदलना पसंद है?
MSIslam

2
मुझे इस लाइन के साथ एक समस्या है: 'TypedArray ta = getStyledAttributes (R.style.MyCustomStyle, attrs);', एंड्रॉइड स्टूडियो मुझे बता रहा है कि यह प्रकार की शैली के संसाधन की अपेक्षा करता है और मैं एनोटेशन को दबाने का कोई तरीका नहीं देख सकता पुस्तकालय का समर्थन करें। मुझे लगता है कि getStyledAttributes के पास @ResSlleable एनोटेशन है जो मुझे एक शैली को एक इंट के माध्यम से पारित करने से रोक रहा है। कोई विचार?
बेन पीयरसन

1
@BenPearson - मेरे पास एक ही मुद्दा था जैसा कि आप TextSize विशेषता प्राप्त करने की कोशिश कर रहे हैं। PrivatMamtora का उत्तर काम करता है और स्वीकृत उत्तर होना चाहिए।
thecoolmacdude

52

@ ओले ने जो उत्तर दिया है, वह निश्चित विशेषताओं का उपयोग करते समय टूटता प्रतीत होता है, जैसे कि शैडोक्लोर, शैडोक्स, शैडोडी, शैडोराडियस (ये केवल कुछ ही हैं जो मैंने पाया, और भी हो सकते हैं)

मुझे इस बात का कोई अंदाजा नहीं है कि यह समस्या क्यों होती है, जिसके बारे में मैं यहां पूछ रहा हूं , लेकिन @AntoineMarques कोडिंग स्टाइल समस्या को हल करने के लिए लगता है।

किसी भी विशेषता के साथ यह काम करने के लिए यह कुछ इस तरह होगा


सबसे पहले, इस तरह के संसाधन आईडी को शामिल करने के लिए एक शैली को परिभाषित करें

attrs.xml

<resources>     
    <declare-styleable name="MyStyle" >
        <attr name="android:textColor" />
        <attr name="android:background" />
        <attr name="android:text" />
    </declare-styleable>
</resources>

फिर कोड में आप पाठ प्राप्त करने के लिए ऐसा करेंगे।

TypedArray ta = obtainStyledAttributes(R.style.MyCustomStyle, R.styleable.MyStyle);  
String text = ta.getString(R.styleable.MyStyle_android_text);

इस पद्धति का उपयोग करने का लाभ यह है, आप नाम से मान प्राप्त कर रहे हैं, न कि एक सूचकांक।


3
यह स्वीकृत उत्तर होना चाहिए क्योंकि ओले के उत्तर ने मेरे लिए "टाइप स्टाइल के अपेक्षित संसाधन" चेतावनी उत्पन्न की।
thecoolmacdude

1
मेरे लिए काम करता है, लेकिन एंड्रॉइड स्टूडियो के साथ मुझे एक उपसर्ग की आवश्यकता है @SuppressWarnings("ResourceType")
eruve

2
यह उत्तर स्वीकृत होना चाहिए। यह मेरी सभी विशेषता के लिए काम करता है, और सबसे ज्यादा मतदान करने वाले ने मुझे बहुत समय बर्बाद किया।
जेरी

1
अपने समाधान के लिए शक्तिशाली डॉल्फिन को धन्यवाद दें। स्वीकृत उत्तर मेरे लिए पृष्ठभूमि (जब उपयोग करने योग्य) और पाठ आकार जैसी विशेषताओं के लिए समस्याएं पैदा करता है। यह समाधान न केवल मेरे लिए आवश्यक सभी विशेषताओं के लिए काम करता है, बल्कि एक क्लीनर कोड भी देता है।
मारियस पी।

2
R.style.MyCustomStyle क्या माना जाता है?
15

1

ओले और प्रिविटामोरा के जवाबों ने मेरे लिए अच्छा काम नहीं किया, लेकिन यह किया।

मान लीजिए कि मैं इस शैली को प्रोग्रामिक रूप से पढ़ना चाहता था:

<style name="Footnote">
    <item name="android:fontFamily">@font/some_font</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">@color/black</item>
</style>

मैं इसे इस तरह से कर सकता था:

fun getTextColorSizeAndFontFromStyle(
    context: Context, 
    textAppearanceResource: Int // Can be any style in styles.xml like R.style.Footnote
) {
    val typedArray = context.obtainStyledAttributes(
        textAppearanceResource,
        R.styleable.TextAppearance // These are added to your project automatically.
    )
    val textColor = typedArray.getColorStateList(
        R.styleable.TextAppearance_android_textColor
    )
    val textSize = typedArray.getDimensionPixelSize(
        R.styleable.TextAppearance_android_textSize
    )

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val typeface = typedArray.getFont(R.styleable.TextAppearance_android_fontFamily)

        // Do something with the typeface...

    } else {
        val fontFamily = typedArray.getString(R.styleable.TextAppearance_fontFamily)
            ?: when (typedArray.getInt(R.styleable.TextAppearance_android_typeface, 0)) {
                1 -> "sans"
                2 -> "serif"
                3 -> "monospace"
                else -> null
            }

        // Do something with the fontFamily...
    }
    typedArray.recycle()
}

मैंने Android के TextAppearanceSpan वर्ग से कुछ प्रेरणा ली, आप इसे यहां पा सकते हैं: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/nyle/TextAppearanceSpan.java


-4

अगर attr.xml को attrs.xml (मेरे लिए काम किया गया) का नाम बदलने की कोशिश के लिए काम नहीं किया गया स्वीकृत समाधान

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