2010-06-01 12 views
14

अन्य questions का कहना है कि शैली प्रोग्राम के रूप में सेट नहीं किया जा सकता है, लेकिन एक Viewजैसे जब इसे एक्सएमएल से भरी हुई है के रूप में initialised एक शैली के साथ हो सकता है।एक विशेष शैली के साथ एक Android देखें बनाना प्रोग्राम के रूप में

मैं View को एक विशेष शैली प्रोग्रामेटिक रूप से (एक्सएमएल में नहीं) के साथ कैसे शुरू कर सकता हूं? मैंने View(Context context, AttributeSet attrs, int defStyle) का उपयोग करने का प्रयास किया, लेकिन मुझे नहीं पता कि दूसरे तर्क के लिए क्या पार्स करना है। null मेंपरिणाम

उत्तर

4

विशेषताएँ में XML (उदा। Layout_width, layout_height आदि) में निर्दिष्ट विशेषताओं की सूची शामिल है।

यदि आप इसे शून्य के रूप में पास कर रहे हैं, तो आपको स्पष्ट रूप से ऊंचाई/चौड़ाई दृश्य निर्धारित करना चाहिए।

+1

'विशेषता एसईटी' में एक कन्स्ट्रक्टर प्रतीत नहीं होता है। Xml का उपयोग किये बिना इसे बनाना संभव है? – Casebash

+0

@Casebash AFAIK, आप एक्सएमएल का उपयोग किए बिना एट्रिब्यूटसेट नहीं बना सकते हैं। आप वर्ग द्वारा प्रदान किए गए कार्यों का उपयोग करके सभी गुणों को सेट कर सकते हैं। – Karan

13

मुझे एक ही समस्या है, लेकिन पर सीधे कोई व्यावहारिक तरीका नहीं मिला है, जो अब तक प्रोग्राम शैलीबद्ध है। मैं अपनी स्क्रीन को कई विजेट्स के साथ पॉप्युलेट करना चाहता हूं, किसी दिए गए प्रकार के, चलिए बटन कहें। यह लेआउट फ़ाइल में सभी को परिभाषित करने के लिए अव्यवहारिक है। मैं उन्हें प्रोग्रामेटिक रूप से बनाना चाहता हूं, लेकिन मैं अपनी शैली को शैली xml फ़ाइल में परिभाषित करना भी चाहूंगा।

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

एक उदाहरण निम्नानुसार है।

शैली फ़ाइल में, अपने बटन के लिए शैली को परिभाषित करें। उदाहरण के लिए:

<style name="niceButton"> 
    <item name="android:layout_width">160dip</item> 
    <item name="android:layout_height">60dip</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">18dip</item> 
    <item name="android:textColor">#000000</item> 
</style> 

फिर उपवर्ग वर्ग "बटन", एक वर्ग "NiceButton" पाने से।

public NiceButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

फिर एक और निर्माता है, जो उद्देश्य के लिए एक मौजूदा बटन क्लोन करने के लिए है परिभाषित: निर्माता कि inflater द्वारा की आवश्यकता होगी परिभाषित

public NiceButton(int id, NiceButton origButton) { 
    super(origButton.getContext()); 
    setId(id); 
    setLayoutParams(origButton.getLayoutParams()); 
    setGravity(origButton.getGravity()); 
    setPadding(origButton.getPaddingLeft(), 
        origButton.getPaddingTop(), 
        origButton.getPaddingRight(), 
        origButton.getPaddingBottom()); 
    setTextSize(TypedValue.COMPLEX_UNIT_PX, origButton.getTextSize()); 
    setTextColor(origButton.getTextColors()); 
    // ... also copy whatever other attributes you care about 
} 

अपने लेआउट फ़ाइल में से केवल पहले एक को परिभाषित आपके बटन उदाहरण है कि आप एक तालिका में अपने बटन रखना चाहते हैं के लिए मान लीजिए:

<TableLayout android:id="@+id/button_table" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TableRow android:id="@+id/button_row_0"> 
     <com.mydomain.mypackage.NiceButton 
        style="@style/niceButton" android:id="@+id/button_0" /> 
     <!-- More rows/buttons created programmatically --> 
    </TableRow> 

</TableLayout> 

सूचना है कि विजेट वर्ग से भरा योग्य नाम का इस्तेमाल किया जाता है; जाहिर है, आपको वास्तविक पैकेज नाम के साथ com.mydomain.mypackage को प्रतिस्थापित करना होगा।

अपनी गतिविधि में, आप जब बटन के किसी भी दबाया जाता है के नाम से जाना एक सरणी जो बटन के सभी के लिए एक संदर्भ पकड़ करने के लिए जा रहा है, और एक आम श्रोता को परिभाषित करना चाहते हो सकता है:

NiceButton[] mButtonViews = new NiceButton[10]; 

private View.OnClickListener mNiceButtonClickListener = new View.OnClickListener() { 
    public void onClick(View view) { 
     int i = view.getId(); 
     mButtonViews[i].setText("PRESSED!"); 
    } 
}; 

ध्यान दें कि दृश्य आईडी को बटन की सरणी में इंडेक्स के रूप में कैसे उपयोग किया जाता है। तो आपको 0 से एन -1 तक आईडी रखने के लिए अपने बटनों की आवश्यकता होगी।

// Retrieve some elements from the layout 
    TableLayout table = (TableLayout)findViewById(R.id.button_table); 
    TableRow row = (TableRow)findViewById(R.id.button_row_0); 
    NiceButton origButton = (NiceButton)findViewById(R.id.button_0); 

    // Prepare button 0 
    origButton.setId(0); 
    origButton.setText("Button 0"); 
    origButton.setOnClickListener(mNiceButtonClickListener); 
    mButtonViews[0] = origButton; 

    // Create buttons 1 to 10 
    for (int i = 1; i < 10; i++) { 
     if (i % 2 == 0) { 
      row = new TableRow(this); 
      table.addView(row); 
     } 
     NiceButton button = new NiceButton(i, origButton); 
     button.setText("Button " + i); 
     button.setOnClickListener(mNiceButtonClickListener); 
     mButtonViews[i] = button; 
     row.addView(button); 
    } 

यहाँ कैसे स्क्रीन के बाद आप कुछ बटन दबाया है दिखाई देता है:: enter image description here

ठीक है, वहाँ कुछ कोड है

अंत में, यहाँ जिस तरह से आप onCreate विधि में अपने बटन बना सकते हैं शामिल है, लेकिन अंत में आप कई विजेट बना सकते हैं जिन्हें आप प्रोग्रामेटिक रूप से चाहते हैं, और अभी भी उनके गुणों को शैली के रूप में परिभाषित किया गया है।

10

आप एक दृश्य शैली चाहते हैं आप 2 विकल्प हैं: सबसे सरल एक बस कोड में सभी तत्वों को निर्दिष्ट करने के लिए है:

button.setTextColor(Color.RED); 
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

अन्य विकल्प एक्सएमएल में शैली को परिभाषित है, और इसे लागू करने के लिए है देखने के लिए। सामान्य स्थिति में, आप इस के लिए एक ContextThemeWrapper उपयोग कर सकते हैं:

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); 
button = new Button(newContext); 

(बटन की तरह या उसके उपवर्ग) एक TextView पर पाठ से संबंधित विशेषताओं को बदलने के लिए वहाँ एक विशेष विधि है:

button.setTextAppearance (संदर्भ, आर। स्टाइल। MyTextStyle);

यह अंतिम व्यक्ति सभी विशेषताओं को बदलने के लिए उपयोग नहीं किया जा सकता है; उदाहरण के लिए पैडिंग बदलने के लिए आपको ContextThemeWrapper का उपयोग करने की आवश्यकता है। लेकिन पाठ रंग, आकार, आदि के लिए आप setTextAppearance का उपयोग कर सकते हैं।

+0

सबसे अच्छा, सरल समाधान। धन्यवाद। – Steelight

+0

setTextApperance() को एपीआई 23 – PaulrBear

+1

@PaulrBear की आवश्यकता है, दो संस्करण हैं, एक एपीआई 1 में जोड़ा गया था और 23 में बहिष्कृत किया गया था, दूसरा 23 – beetstra

संबंधित मुद्दे