2011-02-02 15 views
13

क्या आपकी गतिविधि में सभी विचारों को पुन: प्रयास करने का कोई तरीका है? कुछ की तरह:गतिविधि में सभी दृश्यों को अंकित/Iterate?

Iterator it = getViewIterator(); 
... 

Does this exist at all?

+1

मुझे आश्चर्य है, आप इसे क्यों चाहते हैं? –

+1

हां, ऐसा करने की क्या आवश्यकता है ..? – Javanator

+1

http://code.google.com/p/android/issues/detail?id=8488 देखें, मेरा कोड नीचे – swinefeaster

उत्तर

17

If you have all your Views in a LinearLayout या एक अन्य container फैली कि आप कार्यों getChildCount() और getChildAt(int) का उपयोग करें और
निहित विचारों के सभी के माध्यम से पुनरावृति कर सकते हैं ViewGroup

उम्मीद है कि इससे मदद मिलती है।

+0

हाँ यह पूरी तरह से काम करता है। धन्यवाद! मुझे अपनी बेस गतिविधि में अपने setContentView() फ़ंक्शंस को ओवरराइड करना था ताकि मैं रूट व्यू ग्रुप में पॉइंटर स्टोर कर सकूं और फिर इसे अपनी विधि के माध्यम से पुन: सक्रिय कर सकूं। – swinefeaster

+1

सेटकंटेंट व्यू को ओवरराइड करने के लिए वैकल्पिक, आप दृश्य में बाहरी कंटेनर को एक आईडी प्रदान कर सकते थे और फिर इसेViewById() के साथ पकड़ लिया। –

1

गतिविधि आम तौर पर एक मुख्य लेआउट कंटेनर होता है जिसमें अन्य सभी विचार रखे जाते हैं। मुख्य लेआउट कंटेनर के संदर्भ का उपयोग करना। अपने बच्चे के माध्यम से घूमें (GetChild (postion), getchildcount() आदि का उपयोग करें)। और यदि कोई बच्चा स्वयं एक कंटेनर है तो उस पर एक ही फ़ंक्शन लागू करें..यह कुछ पेड़ संरचना

0

यदि आपको वास्तव में एक पुनरावर्तक की आवश्यकता है, तो एपीआई में उपलब्ध कुछ भी नहीं है। आपको खुद को लिखना होगा जो हैरी जॉय और जावनेटर के तर्क के शीर्ष पर बनाया गया है।

7

"आपकी गतिविधि में सभी विचारों" का मानना ​​है कि आप पदानुक्रम में हर दृश्य का मतलब है, ऐसे 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); 
+0

इस वर्ग के लिए स्रोत कोड के साथ लेखक के पृष्ठ से लिंक करें: http://android-wtf.com/2013/06/how-to-easily-traverse-any-view-hierarchy-in-android/ – ruX

1

यहाँ पर 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; 

    } 
0

तुम बदसूरत के लिए से बचना चाहते हैं (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)) 
निश्चित रूप से

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

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