অ্যান্ড্রয়েড - একটি ভিউয়ের মধ্যে বাচ্চাদের পান?


169

একটি ভিউ দেওয়া হয়েছে কীভাবে আমি এর ভিতরে সন্তানের দৃষ্টিভঙ্গি পেতে পারি?

সুতরাং আমার কাছে একটি কাস্টম ভিউ এবং ডিবাগারটি দেখায় যে এর অধীনে mChildrenঅন্য 7 টি মতামত রয়েছে। এই মতামতগুলি অ্যাক্সেস করার জন্য আমার একটি উপায় দরকার তবে এটি করার জন্য কোনও সর্বজনীন API নেই বলে মনে হয় না।

কোনও পরামর্শ?

সম্পাদনা করুন:

আমার কাস্টম ভিউ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত AdapterView

উত্তর:


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

তা কি করবে?


2
এটি পুনরাবৃত্তভাবে করার সর্বোত্তম উপায় কী এবং এর মাধ্যমে একটি ভিউ উত্তরাধিকারী JSON অবজেক্ট তৈরি করা যায়?
জিম্বব

অভিভাবক দৃশ্যের নাম ধরে নেওয়া হয়েছেviewGroup
Prime 624

57

আপনি যদি কেবল প্রত্যক্ষ প্রত্যক্ষ বাচ্চাদের নয়, সমস্ত বাচ্চাদের বাচ্চাদের পেতে চান তবে আপনাকে এটি পুনরাবৃত্তভাবে করতে হবে:

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");
    }

8
এই কলটি সংরক্ষণ করা যায় না, যেমন, শিশু ভিউগ্রুপের মতো নয় এবং ভিউরূপের মতো হতে পারে, সুতরাং কাস্টম ব্যর্থ হওয়ায় getAllChildren এর পুনরাবৃত্তি কল একটি ব্যতিক্রম ঘটায়। সুতরাং আপনার যদি (! (ভিউ উদাহরণস্বরূপ ভিউগ্রুপ)) রিটার্ন যুক্ত করা উচিত; অভিনেতার আগে
ফিল

2
ছোট পরামর্শ: আপনার for (int i = 0, n = vg.getChildCount(); i < n; i++) অ্যান্ড্রয়েডের সাথে লুপের জন্য প্রতিস্থাপন করুন , কোনও পদ্ধতি কল করার পরিবর্তে স্থানীয় ভেরিয়েবল অ্যাক্সেস করা খুব দ্রুত হতে পারে। এই পদ্ধতিতে, কোনও ভিউ গ্রুপে শুধুমাত্র একবারে একটি পদ্ধতি বলা হয় এবং তারপরে চালানোয় স্থানীয় চালক ব্যবহৃত হয়।
আর্টঅফ ওয়ারফেয়ার

ফিল ডায়েগম্যানের পরামর্শের কারণে আমি কোডটি পরিবর্তন করেছি। আশাকরি এটা সাহায্য করবে. আমার জন্য কাজ কর.
IHeartAndroid

1
কুল। আমি কেবলমাত্র একটি বুলিয়ান 'অন্তর্ভুক্তভিউ গ্রুপগুলি' যুক্ত করার পরামর্শ দিই এবং যদি এটি সত্য হয় তবেই iewArrayList.add (v); এটি অ্যাডাপ্টারে পুনরাবৃত্তি করার জন্য দরকারী (এবং আমার কেবল পাতাগুলি প্রয়োজন)। ধন্যবাদ!
JRun

20

আপনি সবসময় ভিউ.ফাইন্ডভিউবিআইআইডি () http://developer.android.com/references/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);
}

আমার আইডিতে অ্যাক্সেস নেই, ইউআই কোডের মাধ্যমে উত্পন্ন হয়, আমি রোবটিয়াম ব্যবহার করে অটোমেশন লিখছি, তাই আমি যে জিনিসগুলি করতে পারি তা সীমিত
aryaxt

@ জোনসন, আপনার সমস্ত বাচ্চা পাওয়ার দরকার হলে কিছুতেই কার্যকর নয়।
পেসারিয়ার

এছাড়াও quora.com/unanswered/...
Pacerier

17

আমি কেবলমাত্র এই উত্তরটি Viewহায়ারার্কি অনুসারে সমস্ত শিশুর সন্ধানের জন্য বিকল্প @ আইহার্টএন্ড্রয়েডের পুনরাবৃত্ত আলগোরিদিম হিসাবে এই উত্তরটি সরবরাহ করতে যাচ্ছি । মনে রাখবেন যে এই লেখার সময়, পুনরাবৃত্ত সমাধানটি ত্রুটিযুক্ত কারণ এতে তার ফলাফলটিতে নকল থাকবে।

যাদের পুনরাবৃত্তির চারপাশে মাথা গুটিয়ে রাখতে সমস্যা হয় তাদের জন্য এখানে একটি পুনরাবৃত্তি বিকল্প। এটি উপলব্ধি করার জন্য আপনি বোনাস পয়েন্ট পান পুনরাবৃত্তাকারী সমাধানের গভীরতা-প্রথম পদ্ধতির একটি বর্ধিত প্রথম অনুসন্ধান বিকল্প is

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অন্যান্য উত্তর যে নতুন উদাহরণ তৈরি করে তার সংখ্যার সাথে এটি করার সম্ভাবনা রয়েছে । এছাড়াও, ফলাফল শ্রেণিবদ্ধ কত উল্লম্ব / অনুভূমিক হয় তার উপর ভিত্তি করে ফলাফলগুলি পৃথক হতে পারে।

ক্রস পোস্ট থেকে: অ্যান্ড্রয়েড | একটি ভিউ গ্রুপের সমস্ত শিশুদের উপাদান পান


7

এখানে একটি পরামর্শ: আপনি পেতে পারেন 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);

3

2018 এর পরে যারা এই প্রশ্নটি জুড়ে আসে তাদের আপডেট হিসাবে, আপনি যদি কোটলিন ব্যবহার করছেন তবে ভিউয়ের তাত্ক্ষণিক শিশুদের ক্রম পেতে আপনি কেবল অ্যান্ড্রয়েড কেটিএক্স এক্সটেনশন সম্পত্তি ভিউগ্রুপ.চিল্ডেন ব্যবহার করতে পারেন ।


0

একটি সারণী বিন্যাস (টেবিলআলআউট) রিফ্রেশ করার জন্য আমি সমস্ত বাচ্চাদের বাচ্চাদের এবং তারপরে প্রাপ্ত করার জন্য উপরে উল্লিখিত পুনরাবৃত্ত পদ্ধতির ব্যবহার শেষ করেছি।

আমার পরিস্থিতি কিছুটা সরল করা হয়েছিল কারণ আমার কেবল লিনিয়ারলআউট এবং টেবিললআউট এর মতো বর্ধিত ক্লাসগুলির সাথে কাজ করা দরকার। এবং আমি কেবল টেক্সটভিউ বাচ্চাদের সন্ধানে আগ্রহী ছিলাম। তবে আমি মনে করি এটি এখনও এই প্রশ্নের ক্ষেত্রে প্রযোজ্য।

চূড়ান্ত শ্রেণি পৃথক থ্রেড হিসাবে চালিত হয়, যার অর্থ এটি বাচ্চাদের পার্স করার আগে পটভূমিতে অন্যান্য জিনিসগুলি করতে পারে। কোডটি ছোট এবং সহজ এবং গিথুব এ পাওয়া যাবে: https://github.com/jkincali/Android-LinearLayout-Parser


0

এই পদ্ধতিটি একটি বিন্যাসের মধ্যে সমস্ত মতামত গ্রহণ করে, এটি আলেকজান্ডার কুলিয়াখতিনের উত্তরের অনুরূপ। পার্থক্যটি হ'ল এটি যে কোনও ধরণের প্যারেন্ট লেআউটগুলি গ্রহণ করে এবং একটি অ্যারে ভিউয়ের তালিকা দেয়।

public List<View> getAllViews(ViewGroup layout){
        List<View> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            views.add(layout.getChildAt(i));
        }
        return views;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.