मुझे एक ही समस्या है, लेकिन पर सीधे कोई व्यावहारिक तरीका नहीं मिला है, जो अब तक प्रोग्राम शैलीबद्ध है। मैं अपनी स्क्रीन को कई विजेट्स के साथ पॉप्युलेट करना चाहता हूं, किसी दिए गए प्रकार के, चलिए बटन कहें। यह लेआउट फ़ाइल में सभी को परिभाषित करने के लिए अव्यवहारिक है। मैं उन्हें प्रोग्रामेटिक रूप से बनाना चाहता हूं, लेकिन मैं अपनी शैली को शैली 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);
}
यहाँ कैसे स्क्रीन के बाद आप कुछ बटन दबाया है दिखाई देता है::
ठीक है, वहाँ कुछ कोड है
अंत में, यहाँ जिस तरह से आप onCreate विधि में अपने बटन बना सकते हैं शामिल है, लेकिन अंत में आप कई विजेट बना सकते हैं जिन्हें आप प्रोग्रामेटिक रूप से चाहते हैं, और अभी भी उनके गुणों को शैली के रूप में परिभाषित किया गया है।
'विशेषता एसईटी' में एक कन्स्ट्रक्टर प्रतीत नहीं होता है। Xml का उपयोग किये बिना इसे बनाना संभव है? – Casebash
@Casebash AFAIK, आप एक्सएमएल का उपयोग किए बिना एट्रिब्यूटसेट नहीं बना सकते हैं। आप वर्ग द्वारा प्रदान किए गए कार्यों का उपयोग करके सभी गुणों को सेट कर सकते हैं। – Karan