क्या आपकी गतिविधि में सभी विचारों को पुन: प्रयास करने का कोई तरीका है? कुछ की तरह:गतिविधि में सभी दृश्यों को अंकित/Iterate?
Iterator it = getViewIterator();
...
Does this exist at all?
क्या आपकी गतिविधि में सभी विचारों को पुन: प्रयास करने का कोई तरीका है? कुछ की तरह:गतिविधि में सभी दृश्यों को अंकित/Iterate?
Iterator it = getViewIterator();
...
Does this exist at all?
If you have all your Views in a LinearLayout
या एक अन्य container
फैली कि आप कार्यों getChildCount()
और getChildAt(int)
का उपयोग करें और
निहित विचारों के सभी के माध्यम से पुनरावृति कर सकते हैं ViewGroup
।
उम्मीद है कि इससे मदद मिलती है।
हाँ यह पूरी तरह से काम करता है। धन्यवाद! मुझे अपनी बेस गतिविधि में अपने setContentView() फ़ंक्शंस को ओवरराइड करना था ताकि मैं रूट व्यू ग्रुप में पॉइंटर स्टोर कर सकूं और फिर इसे अपनी विधि के माध्यम से पुन: सक्रिय कर सकूं। – swinefeaster
सेटकंटेंट व्यू को ओवरराइड करने के लिए वैकल्पिक, आप दृश्य में बाहरी कंटेनर को एक आईडी प्रदान कर सकते थे और फिर इसेViewById() के साथ पकड़ लिया। –
गतिविधि आम तौर पर एक मुख्य लेआउट कंटेनर होता है जिसमें अन्य सभी विचार रखे जाते हैं। मुख्य लेआउट कंटेनर के संदर्भ का उपयोग करना। अपने बच्चे के माध्यम से घूमें (GetChild (postion), getchildcount() आदि का उपयोग करें)। और यदि कोई बच्चा स्वयं एक कंटेनर है तो उस पर एक ही फ़ंक्शन लागू करें..यह कुछ पेड़ संरचना
यदि आपको वास्तव में एक पुनरावर्तक की आवश्यकता है, तो एपीआई में उपलब्ध कुछ भी नहीं है। आपको खुद को लिखना होगा जो हैरी जॉय और जावनेटर के तर्क के शीर्ष पर बनाया गया है।
"आपकी गतिविधि में सभी विचारों" का मानना है कि आप पदानुक्रम में हर दृश्य का मतलब है, ऐसे Iterator
या एंड्रॉइड में कुछ भी नहीं है जो आपको सभी विचारों पर पुन: सक्रिय करने की अनुमति देता है।
ViewGroup
के पास getChildCount
और getChildAt
विधियां हैं, लेकिन वे ViewGroup
के प्रत्यक्ष बच्चों के बारे में हैं। तो, आपको हर बच्चे की यात्रा करने की आवश्यकता होगी, और जांचें कि यह ViewGroup
स्वयं है, और इसी तरह। लंबी कहानी छोटी, मैं एक विशिष्ट टैग से मेल खाने वाले सभी विचारों को ढूंढने की ऐसी कार्यक्षमता चाहता था (findViewWithTag केवल पहले लौटाता है), इसलिए मैंने इसे प्राप्त करने के लिए a few classes लिखा। यहाँ कैसे आप एक Layout
के तहत प्रत्येक दृश्य के ऊपर पुनरावृति कर सकते हैं:
LayoutTraverser.build(new LayoutTraverser.Processor() {
@Override
public void process(View view) {
// do stuff with the view
}
}).traverse(viewGroup);
इस वर्ग के लिए स्रोत कोड के साथ लेखक के पृष्ठ से लिंक करें: http://android-wtf.com/2013/06/how-to-easily-traverse-any-view-hierarchy-in-android/ – ruX
यहाँ पर Harry Joy's answer आधारित मेरी उदाहरण है,। यह माता पिता ViewGroup
के सभी पदानुक्रम के माध्यम से iterates अगर कहीं भी यह भीतर से किसी भी दृश्य को देखने के लिए एक Button
:
private boolean doesViewGroupContainButton(ViewGroup parentView) {
int numChildViews = parentView.getChildCount();
for (int i = 0; i < numChildViews; i++) {
View childView = parentView.getChildAt(i);
if (childView instanceof ViewGroup) {
if (doesViewContainButton((ViewGroup)childView)) {
return true;
}
}
else if (childView instanceof Button) {
return true;
}
}
return false;
}
तुम बदसूरत के लिए से बचना चाहते हैं (int i = 0; ....) आप एक स्थिर आवरण
public class Tools
{
public static Iterable<View> getChildViews(final ViewGroup view)
{
return new Iterable<View>()
{
int i = -1;
@NonNull
@Override
public Iterator<View> iterator()
{
return new Iterator<View>()
{
int i = -1;
@Override
public boolean hasNext()
{
return i < view.getChildCount();
}
@Override
public View next()
{
return view.getChildAt(++i);
}
};
}
};
}
}
का उपयोग करें और इसलिए
for (View view : Tools.getChildViews(viewGroup))
निश्चित रूप से
की तरह उपयोग कर सकते हैं इस थोड़ा कम कुशल है जब से तुम मूल्य बना रहे हैं हर बार जब आप पुन: प्रयास करते हैं तो एक नई इटेटेबल ऑब्जेक्ट में प्रवेश करते हैं, लेकिन यदि आप चाहें तो आप इसे अधिक कुशल अलगो बना सकते हैं।
मुझे आश्चर्य है, आप इसे क्यों चाहते हैं? –
हां, ऐसा करने की क्या आवश्यकता है ..? – Javanator
http://code.google.com/p/android/issues/detail?id=8488 देखें, मेरा कोड नीचे – swinefeaster