অ্যান্ড্রয়েড - ডায়নামিকভাবে ভিউতে ভিউ যুক্ত করুন


148

আমার দেখার জন্য একটি বিন্যাস আছে -

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:orientation="vertical">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_header"
        style="@style/Home.ListHeader" />

    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_none"
        android:visibility="gone"
        style="@style/TextBlock"
        android:paddingLeft="6px" />

    <ListView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/items_list" />


</LinearLayout>

আমি যা করতে চাই তা হল এই জাতীয় লেআউট সহ আমার মূল ক্রিয়াকলাপে

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="0px"
    android:id="@+id/item_wrapper">
</LinearLayout>

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


উত্তর:


230

LayoutInflaterআপনার লেআউট টেমপ্লেটের উপর ভিত্তি করে একটি ভিউ তৈরি করতে ব্যবহার করুন এবং তারপরে আপনার যেখানে প্রয়োজন সেখানে ভিউটি ইনজেক্ট করুন।

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

আপনি যেখানে ভিউটি সন্নিবেশ করতে চান সেখানে আপনাকে সূচকটি সামঞ্জস্য করতে হতে পারে।

অতিরিক্তভাবে, আপনি কীভাবে প্যারেন্ট ভিউতে ফিট করতে চান তা অনুযায়ী লেআউটপ্যারাম সেট করুন। উদাহরণস্বরূপ FILL_PARENT, বা MATCH_PARENT, ইত্যাদি


2
এটি যেখানেই আপনি আপনার মূল দৃশ্যে গতিশীল উত্পন্ন লেআউটটি রাখতে চান। এটি আপনার নিজের কোড থেকে পূরণ করতে হবে bit
মার্ক ফিশার

যারা এখনই এটি ব্যবহার করে দেখতে চান - প্রথম লাইনে দেখানো হিসাবে প্রাপ্ত লেআউট ইনফ্ল্লেটরটি এখনও সমাধান করে তবে কাজ করে না, পরিবর্তে ব্যবহার করুনgetLayoutInflater()
ব্রেন্ডন

2
LayoutInflater vi = getLayoutInflater();ক্রিয়াকলাপ থিম সংরক্ষণ করতে কোনও কার্যকলাপ থেকে ব্যবহার করুন যা আপনি অন্যথায় পাবেন না otherwise
akarthik10

1
@ এমআরজি আপনার উচিত হবে যাতে আলাদা করে প্রশ্ন উত্থাপন করা উচিত। এই প্রশ্নটি কীভাবে গতিশীলভাবে ভিউগুলি তৈরি করতে পারে, খণ্ডগুলি সম্পর্কে নয়।
মার্ক ফিশার

2
@ আরশ আপনার যদি নতুন প্রশ্ন এবং নির্দিষ্ট সমস্যা থাকে তবে আপনি কোন কোডটি চেষ্টা করেছেন তা এখানে মন্তব্য করার পরিবর্তে কাজ করছে না তা বিশদ করে একটি আলাদা এসও প্রশ্ন উত্থাপন করুন।
মার্ক ফিশার

36

LayoutInflaterক্লাস দেখুন ।

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);

স্ফীত হওয়া ব্যক্তিদের মতামতগুলিতে আমি কীভাবে ক্লিক ক্লিস্টনার যুক্ত করব। দয়া করে একটি স্নিপেট সরবরাহ করুন
সাগর দেবঙ্গা

20

দেখে মনে হচ্ছে আপনি নির্দিষ্ট লেআউটটি ফুলে তুলতে কাস্টম অ্যাডাপ্টারের সাথে তালিকার ভিউটি কী চান really একটি অ্যারেএডাপ্টার এবং পদ্ধতিটি ব্যবহার করে notifyDataSetChanged()আপনার ভিউ জেনারেশন এবং রেন্ডারিংয়ের সম্পূর্ণ নিয়ন্ত্রণ রাখবেন।

এই টিউটোরিয়াল একবার দেখুন


14

@ মার্ক ফিশারের উত্তরটি আরও সুস্পষ্ট করতে, সন্নিবেশিত হওয়া ভিউটি লেআউট ফোল্ডারের অধীনে একটি এক্সএমএল ফাইল হওয়া উচিত তবে লাইনারালআউট ইত্যাদির মতো বিন্যাস (ভিউগ্রুপ) ছাড়াই। আমার উদাহরণ:

মাঝামাঝি / লেআউট / my_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/i_am_id"
    android:text="my name"
    android:textSize="17sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"/>

তারপরে, সন্নিবেশ পয়েন্টটি লিনিয়ারলআউটের মতো একটি বিন্যাস হওয়া উচিত:

মাঝামাঝি / লেআউট / activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/aaa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/insert_point"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </LinearLayout>

</RelativeLayout>

তারপরে কোডটি হওয়া উচিত

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shopping_cart);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.my_view, null);
    ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
    main.addView(view, 0);
}

আমি এই অনুরূপ উত্তরটি পোস্ট করার কারণটি হ'ল আমি যখন মার্কের সমাধানটি প্রয়োগ করার চেষ্টা করেছি তখন আমি কী এক্সএমএল ফাইল insert_Point এবং সন্তানের দৃশ্যের জন্য ব্যবহার করব তা নিয়ে আটকে গেলাম। আমি প্রথমে শিশু দর্শনে বিন্যাসটি ব্যবহার করেছি এবং এটি সম্পূর্ণরূপে কাজ করছে না, যা আমাকে বেশ কয়েক ঘন্টা সময় নিয়েছিল। সুতরাং আশা করি আমার অনুসন্ধান অন্যের সময় বাঁচাতে পারে।


@ ইয়র্ক ইয়াং লুপের জন্য যদি আমরা একাধিক ভিউ যোগ করি তবে আমি কীভাবে এখানে আইডির ভিগুলি যুক্ত করতে পারি।
রাহুল কুশওয়াহা

5
// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);

// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;

for (int i = 1; i < 101; i++){
    // Add the text layout to the parent layout
    view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);

    // In order to get the view we have to use the new view with text_layout in it
    TextView textView = (TextView)view.findViewById(R.id.text);
    textView.setText("Row " + i);

    // Add the text view to the parent layout
    parentLayout.addView(textView);
}

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

ফর লুপ ব্যবহার করে তৈরি করা বিভিন্ন দর্শনের আইডি কীভাবে পেতে পারি।
রাহুল কুশওয়াহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.