কিভাবে একটি বিন্যাসের সাথে একটি ভিউ স্ফীত করা যায়


221

আমি এক্সএমএল সংজ্ঞায়িত একটি বিন্যাস আছে। এতে আরও রয়েছে:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

আমি অন্যান্য এক্সএমএল লেআউট ফাইলের সাথে এই রিলেটিভভিউতে স্ফীত করতে চাই। আমি পরিস্থিতির উপর নির্ভর করে বিভিন্ন লেআউট ব্যবহার করতে পারি। আমি এটা কিভাবে করব? আমি বিভিন্ন প্রকারের চেষ্টা করছিলাম

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

তবে তাদের কেউই ভাল কাজ করেননি।

উত্তর:


390

আমি নিশ্চিত নই যে আমি আপনার প্রশ্নটি অনুসরণ করেছি- আপনি কি সন্তানের দৃষ্টিভঙ্গি রিলেটিভলআউটটিতে সংযুক্ত করার চেষ্টা করছেন? যদি তাই হয় তবে আপনি এই লাইনের সাথে কিছু করতে চান:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
আমি একটি ত্রুটি পেয়েছি: 02-25 22: 21: 19.324: এআরআরআর / অ্যান্ড্রয়েড রুনটাইম (865): এর কারণ: জাভা.এল.এলজিগল স্টেট এক্সেক্সেশন: নির্দিষ্ট সন্তানের ইতিমধ্যে একটি পিতামাতা রয়েছে। আপনাকে অবশ্যই প্রথমে সন্তানের পিতামাতার কাছে রিমুভ ভিউ () কল করতে হবে।
মিশাল ডিমেল

27
এই মুহূর্তে এটি চেষ্টা করে দেখুন, আমার প্রয়োজন: দেখুন শিশু = getLayoutInflater () infফোঁটা (আর।
জেমস

3
সমস্যাটি কোড নয়। কোডটি অনুসরণ করা মোটামুটি সহজ। আপনি এক্সএমএল ফাইলটি কোথায় তৈরি করবেন। টাইপ একটি থিম শৈলী সম্পদ? লোকেদের যে সমস্যাটি আমি অন্তর্ভুক্ত করেছি তা হ'ল আমরা এই এক্সএমএল ফাইলটি কোথায়
রাখছি

15

3
উত্তরটি ভুল হলেও এটি কাজ করে। দয়া করে খুঁজে বার করো পোস্টটি possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

আপনি একটি এক্সএমএল সংস্থান উত্সাহিত করুন। দেখুন LayoutInflater ডক

যদি আপনার লেআউটটি মাইলেআউট.এক্সএমএল হয় তবে আপনি এমন কিছু করতে পারেন:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
আমার মূল দৃষ্টিভঙ্গি ফুলে উঠেছে। সমস্যাটি হ'ল আমি অন্যান্য এক্সএমএল ফাইল থেকে এর কিছু অংশ স্ফীত করতে চাই। এই আইটেমটি রিলেটিভলআউটটি বড় লেআউটের অংশ এবং আমি এটি অন্য একটি এক্সএমএল ফাইল থেকে বিন্যাসে পূরণ করতে চাই।
মিশাল ডিমেল

হাম আমি দুঃখিত তবে আমার কোনও ধারণা নেই :( আপনি অন্য লেআউট অন্তর্ভুক্ত করার জন্য আপনার মূল দৃষ্টিতে <অন্তর্ভুক্ত> এর মতো কিছু ব্যবহার করছেন?
চেনেসন

না, এটি সরল বিন্যাস। আমি মনে করি আমি এক্সএমএল ছাড়াই কেবলমাত্র আমার উপাদানগুলিকে প্রোগ্রামক্রমে যুক্ত করব। সাহায্যের জন্য ধন্যবাদ!
মিশাল ডিমেল

27

যদিও দেরিতে উত্তর, তবে এটির জন্য এটি একটি উপায় যুক্ত করতে চাই

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

যেখানে itemআপনি একটি শিশু বিন্যাস যুক্ত করতে চান সেখানে পিতামাতার বিন্যাসটি।


(এমনকি পরে এখনও) আপনার উত্তরটি প্রয়োগ করতে আমার অসুবিধা হচ্ছে। আপনি উল্লিখিত কোডটি আমি চেষ্টা করেছি তবে 'আইটেম' এর সাথে প্রতিস্থাপন করেছি: 'R.layout.activity_layout' আমি পেয়ে যাচ্ছি "(int, int)" এর কোনও প্রয়োগযোগ্য পদ্ধতি নেই "" আমি কি আপনার চিন্তার জন্য ঝামেলা করতে পারি?
কাইল 21

1
@ কাইল - এখনও পরে। আপনি Rকোনও বস্তুর রেফারেন্স হিসাবে সংস্থানগুলি ব্যবহার করতে পারবেন না , তারা কেবলমাত্র int। আপনাকে findViewByIdএটি Rসংস্থানটি ব্যবহার করে ব্যবহার করতে হবে , তারপরে এটি আপনার পছন্দসই বস্তুটিতে কাস্ট করুন। তারপরে আপনি এটিকে ফাংশন কলগুলিতে ব্যবহার করতে পারেন inflate। (উদাহরণস্বরূপ ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... তারপরে আপনি itemউপরের মতো ব্যবহার করতে পারেন ))
পিম্প ট্রাইস্কিট

আমার ধারণা আমার উপরের উদাহরণে RelativeLayoutপরিবর্তে আমি ব্যবহার ViewGroupকরব না, যেমন আপনি বেস ক্লাসটি ইনস্ট্যান্ট করতে পারবেন না ViewGroup। 5 মিনিটের সম্পাদনার নিয়ম আমাকে পেয়েছে। lol
পিম্প ট্রাইস্কিট

পিতামাতাকে আড়াল করা এবং কেবলমাত্র শিশু দর্শন প্রদর্শন করা সম্ভব
নভাসমোবাইল

ধন্যবাদ, এই পদ্ধতিটি যেখানে আমি পূর্ববর্তী উদাহরণে getContext () ব্যবহার করতে পারি না সেহেতু সাহায্য করেছে যেহেতু আমি টুকরো ব্যবহার করছি।
রাইটহ্যান্ডডমনকি

19

এটি যুক্ত করতে সহায়ক, যদিও এটি একটি পুরাতন পোস্ট, যদিও এক্সএমএল থেকে সঞ্চারিত শিশু দৃষ্টিভঙ্গি যদি একটি ভিউ গ্রুপের বিন্যাসে যুক্ত করা হয় তবে আপনাকে কী ধরণের ভিউগ্রুপ চলছে এটির একটি ক্লু দিয়ে আপনাকে স্ফীত কল করতে হবে that যোগ করা হবে। ভালো লেগেছে:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

স্ফীত পদ্ধতিটি বেশ ওভারলোড হয়েছে এবং ডক্সে ব্যবহারের এই অংশটি বর্ণনা করে। আমার একটি সমস্যা হয়েছিল যেখানে আমি এই ধরণের পরিবর্তন না হওয়া পর্যন্ত এক্সএমএল থেকে স্ফীত একক ভিউ পিতামাতার মধ্যে সঠিকভাবে সারিবদ্ধ হয় না।


পরিশেষে, আপনাকে ধন্যবাদ :) এটি একক পিতামাতার একাধিক মতামত যুক্ত করতে দেয় তবে লেআউটপ্যারামগুলি নিয়ে কোনও চিন্তা করার দরকার নেই - যা এক্সএমএল থেকে পড়ে read ভাল করেছ!
সাবো

13

এমনকি সহজ উপায় ব্যবহার করা হয়

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

ব্যবহার View.inflate()হ'ল সর্বোত্তম উপায়, কোনও অপ্রয়োজনীয় LayoutInflaterবা getSystemService(Context.LAYOUT_INFLATER_SERVICE)বা এই সমস্ত উপদ্রবগুলির কোনও! : ডি
বরুণ

8

লেআউট মূল্যস্ফীতি

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

আপনি যদি কোনও ক্রিয়াকলাপে না থাকেন from()তবে LayoutInflaterক্লাস থেকে স্থির পদ্ধতিটি ব্যবহার করতে পারেন LayoutInflater, বা প্রাসঙ্গিক পদ্ধতিতেও পরিষেবার জন্য অনুরোধ getSystemService()করতে পারেন:

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(আমি জানি এটি প্রায় 4 বছর আগের তবে এখনও উল্লেখযোগ্য)


4

আপনি যদি একক ভিউ একাধিকবার যুক্ত করতে চান তবে আপনাকে ব্যবহার করতে হবে

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

ভালো লাগলে

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

এবং

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

তারপরে এটি সমস্ত প্রস্তুত যুক্ত দৃষ্টিভঙ্গি বাদ দেবে।


4

সংযুক্তি সত্যরূপে সেট করুন

কেবলমাত্র মনে করুন আমরা একটি এক্সএমএল লেআউট ফাইলে একটি বোতাম নির্দিষ্ট করেছি যার বিন্যাসের প্রস্থ এবং লেআউটের উচ্চতাটি ম্যাচ_প্যারেন্টে সেট করা আছে।

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

এই বোতামগুলিতে ইভেন্ট ইভেন্ট ক্লিক করুন আমরা এই ক্রিয়াকলাপে লেআউট স্ফীত করতে নিম্নলিখিত কোডটি সেট করতে পারি।

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

আশা করি এই সমাধানটি আপনার পক্ষে কাজ করে!


3

এই কোড ব্যবহার করে দেখুন:

  1. আপনি যদি কেবল আপনার বিন্যাসটি স্ফীত করতে চান:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. আপনি যদি নিজের লেআউটটিকে পাত্রে (প্যারেন্ট লেআউট) স্ফীত করতে চান:

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

আমার অনন্য পরিস্থিতির কারণে আমি এই ত্রুটিটির সাথে সবচেয়ে কঠিন সময় কাটিয়েছি, তবে শেষ পর্যন্ত একটি সমাধান পেয়েছি।

আমার পরিস্থিতি: আমি একটি পৃথক দর্শন (এক্সএমএল) ব্যবহার করছি যা একটি ধারণ করে WebView, তারপরে AlertDialogযখন আমি আমার প্রধান ক্রিয়াকলাপের দর্শনে একটি বোতাম টিপে ক্লিক করি। তবে কোনওভাবে বা অন্য WebViewকোনওটি মূল ক্রিয়াকলাপের দৃশ্যের সাথে সম্পর্কিত (সম্ভবত আমি এখান থেকে সংস্থানটি টানছি), সুতরাং আমার AlertDialog(দর্শন হিসাবে) এটি অর্পণ করার ঠিক আগে , আমাকে আমার পিতামাতাকে পেতে WebViewহবে, এটি একটি ViewGroup, তারপরে তার সমস্ত মতামত সরান ViewGroup। এটি কাজ করে, এবং আমার ত্রুটি চলে যায়।

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... পরে আমার লোড করার পরে WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

আপনি যদি সন্তানের দৃষ্টিভঙ্গি রিলেটিভলআউটটিতে সংযুক্ত করার চেষ্টা করছেন? আপনি অনুসরণ করে করতে পারেন

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

কোটলিন সহ, আপনি ব্যবহার করতে পারেন:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

আমি এর জন্য নীচে কোড স্নিপেট ব্যবহার করেছি এবং এটি আমার জন্য কাজ করেছে।

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.