सवाल एंड्रॉइड - बच्चों को एक दृश्य के अंदर प्राप्त करें?


एक दृश्य को देखते हुए मैं इसके अंदर बच्चे के विचार कैसे प्राप्त कर सकता हूं?

तो मेरे पास एक कस्टम व्यू और डीबगर दिखाता है कि नीचे mChildren 7 अन्य विचार हैं। मुझे इन विचारों तक पहुंचने का एक तरीका चाहिए, लेकिन ऐसा नहीं लगता है कि ऐसा करने के लिए एक सार्वजनिक एपीआई है।

कोई सुझाव?

संपादित करें:

मेरा कस्टम दृश्य से विरासत में आता है AdapterView


137
2017-12-06 03:59


मूल




जवाब:


for(int index=0; index<((ViewGroup)viewGroup).getChildCount(); ++index) {
    View nextChild = ((ViewGroup)viewGroup).getChildAt(index);
}

कर लेंगे?


256
2017-12-06 04:13



इसे बार-बार करने का सबसे अच्छा तरीका क्या है और इस प्रकार एक दृश्य विरासत JSON ऑब्जेक्ट उत्पन्न करता है? - jimbob


यदि आप न केवल सभी प्रत्यक्ष बच्चों को प्राप्त करना चाहते हैं बल्कि सभी बच्चों के बच्चों को भी प्राप्त करना चाहते हैं, तो आपको इसे फिर से करना होगा:

private ArrayList<View> getAllChildren(View v) {

    if (!(v instanceof ViewGroup)) {
        ArrayList<View> viewArrayList = new ArrayList<View>();
        viewArrayList.add(v);
        return viewArrayList;
    }

    ArrayList<View> result = new ArrayList<View>();

    ViewGroup vg = (ViewGroup) v;
    for (int i = 0; i < vg.getChildCount(); i++) {

        View child = vg.getChildAt(i);

        ArrayList<View> viewArrayList = new ArrayList<View>();
        viewArrayList.add(v);
        viewArrayList.addAll(getAllChildren(child));

        result.addAll(viewArrayList);
    }
    return result;
}

परिणाम का उपयोग करने के लिए आप ऐसा कुछ कर सकते हैं:

    // check if a child is set to a specific String
    View myTopView;
    String toSearchFor = "Search me";
    boolean found = false;
    ArrayList<View> allViewsWithinMyTopView = getAllChildren(myTopView);
    for (View child : allViewsWithinMyTopView) {
        if (child instanceof TextView) {
            TextView childTextView = (TextView) child;
            if (TextUtils.equals(childTextView.getText().toString(), toSearchFor)) {
                found = true;
            }
        }
    }
    if (!found) {
        fail("Text '" + toSearchFor + "' not found within TopView");
    }

46
2018-06-29 13:57



यह कॉल सहेज नहीं है, उदाहरण के लिए बच्चा प्रकार का हो सकता है व्यू ग्रुप का देखें और नहीं, इसलिए GetAllChildren का रिकर्सिव कॉल अपवाद का कारण बन सकता है, क्योंकि कलाकार विफल रहता है। तो आपको एक if (! (V exampleof ViewGroup) जोड़ना चाहिए) वापसी; कास्ट से पहले - Phil Diegmann
छोटा सुझाव: लूप के साथ अपने प्रतिस्थापित करें for (int i = 0, n = vg.getChildCount(); i < n; i++)  एंड्रॉइड पर, एक विधि को कॉल करने के बजाय स्थानीय चर का उपयोग करना बहुत तेज़ होता है। इस तरह, एक विधि प्रति दृश्य समूह में केवल एक बार बुलाया जाता है और उसके बाद बाद में एक स्थानीय चर का उपयोग किया जाता है। - ArtOfWarfare
मैंने फिल डिगमान के सुझाव के कारण कोड बदल दिया। उम्मीद है की यह मदद करेगा। मेरे लिये कार्य करता है। - IHeartAndroid
ठंडा। मैं केवल एक बूलियन 'includeViewGroups' जोड़ने का सुझाव दूंगा और केवल तभी सत्य होगा, iewArrayList.add (v); यह एक एडाप्टर में पुनरावृत्त करने के लिए उपयोगी है (और मुझे केवल पत्ते की जरूरत है)। धन्यवाद! - JRun


आप हमेशा View.findViewById () के माध्यम से बाल दृश्यों तक पहुंच सकते हैं http://developer.android.com/reference/android/view/View.html#findViewById(int)।

उदाहरण के लिए, एक गतिविधि / दृश्य के भीतर:

...
private void init() {
  View child1 = findViewById(R.id.child1);
}
...

या यदि आपके पास एक दृश्य का संदर्भ है:

...
private void init(View root) {
  View child2 = root.findViewById(R.id.child2);
}

16
2017-12-06 04:11



मेरे पास आईड्स तक पहुंच नहीं है, यूआई कोड के माध्यम से उत्पन्न होता है, मैं रोबोटियम का उपयोग करके स्वचालन लिख रहा हूं, इसलिए जो कुछ मैं कर सकता हूं वह सीमित है - aryaxt


मैं सिर्फ इस बच्चे को सभी बच्चों की खोज के लिए वैकल्पिक @ IHeartAndroid के रिकर्सिव एल्गोरिदम के रूप में प्रदान करने जा रहा हूं Viewएक दृश्य पदानुक्रम में है। ध्यान दें कि इस लेखन के समय, पुनरावर्ती समाधान त्रुटिपूर्ण है इसमें इसके परिणामस्वरूप डुप्लीकेट होंगे।

उन लोगों के लिए जिन्हें अपने सिर को रिकर्सन के चारों ओर लपेटने में परेशानी है, यहां एक गैर-पुनरावर्ती विकल्प है। यह महसूस करने के लिए आपको बोनस अंक भी मिलते हैं चौड़ाई-पहले के लिए खोज विकल्प गहराई-प्रथम पुनरावर्ती समाधान के दृष्टिकोण।

private List<View> getAllChildrenBFS(View v) {
    List<View> visited = new ArrayList<View>();
    List<View> unvisited = new ArrayList<View>();
    unvisited.add(v);

    while (!unvisited.isEmpty()) {
        View child = unvisited.remove(0);
        visited.add(child);
        if (!(child instanceof ViewGroup)) continue;
        ViewGroup group = (ViewGroup) child;
        final int childCount = group.getChildCount();
        for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
    }

    return visited;
}

कुछ त्वरित परीक्षण (औपचारिक कुछ भी नहीं) सुझाव देते हैं कि यह विकल्प भी तेज़ है, हालांकि इसकी नई संख्या के साथ सबसे अधिक संभावना है ArrayList अन्य जवाब बनाता है उदाहरण देता है। साथ ही, दृश्य पदानुक्रम कितना ऊर्ध्वाधर / क्षैतिज है, इस पर आधारित भिन्नताएं भिन्न हो सकती हैं।

से क्रॉस-पोस्ट किया गया: एंड्रॉइड | व्यू ग्रुप के सभी बच्चों के तत्व प्राप्त करें


13
2017-09-16 00:04





यहां एक सुझाव दिया गया है: आप प्राप्त कर सकते हैं ID (निर्दिष्ट उदा android:id="@+id/..My Str..) जो उत्पन्न हुआ था R इसके दिए गए नाम का उपयोग करके (उदा। My Str)। एक कोड स्निपेट का उपयोग कर getIdentifier() विधि तब होगी:

public int getIdAssignedByR(Context pContext, String pIdString)
{
    // Get the Context's Resources and Package Name
    Resources resources = pContext.getResources();
    String packageName  = pContext.getPackageName();

    // Determine the result and return it
    int result = resources.getIdentifier(pIdString, "id", packageName);
    return result;
}

एक के भीतर से Activity, एक उदाहरण उपयोग के साथ मिलकर findViewById होने वाला:

// Get the View (e.g. a TextView) which has the Layout ID of "UserInput"
int rID = getIdAssignedByR(this, "UserInput")
TextView userTextView = (TextView) findViewById(rID);

5
2018-06-08 14:16





एक टेबल लेआउट (टेबललाउट) को रीफ्रेश करने के लिए मैंने ऊपर वर्णित रिकर्सिव दृष्टिकोण का उपयोग सभी बच्चों के बच्चों को प्राप्त करने के लिए किया है।

मेरी स्थिति कुछ हद तक सरलीकृत थी क्योंकि मुझे केवल लाइनरलाउट के साथ काम करने की आवश्यकता थी और उन वर्गों को टेबललाउट जैसे विस्तारित किया गया था। और मुझे केवल टेक्स्ट व्यू बच्चों को खोजने में दिलचस्पी थी। लेकिन मुझे लगता है कि यह अभी भी इस सवाल पर लागू है।

अंतिम वर्ग एक अलग थ्रेड के रूप में चलता है, जिसका अर्थ है कि यह बच्चों के लिए पार्सिंग से पहले पृष्ठभूमि में अन्य चीजें कर सकता है। कोड छोटा और सरल है और जिथब में पाया जा सकता है: https://github.com/jkincali/Android-LinearLayout-Parser


0
2017-11-29 21:25