কীভাবে প্রোগ্রামে ভিউগুলিতে ভিউ যুক্ত করা যায়


179

ধরা যাক আমার একটি আছে LinearLayoutএবং আমি জাভা কোড থেকে আমার প্রোগ্রামে এটিতে একটি ভিউ যুক্ত করতে চাই। এর জন্য কোন পদ্ধতি ব্যবহার করা হয়? আমি জিজ্ঞাসা করছি না এটি কীভাবে এক্সএমএলে হয়েছে, যা আমি জানি, বরং, এই নমুনা কোডটির লাইন ধরে আমি কীভাবে কিছু করতে পারি?

(One View).add(Another View)

যেমন একটি সুইং করতে পারেন।

উত্তর:


248

কল addViewকরা সঠিক উত্তর, তবে এটি কার্যকর হওয়ার জন্য আপনাকে তার থেকে কিছুটা বেশি করা দরকার।

যদি আপনি কোনও কনস্ট্রাক্টরের মাধ্যমে একটি ভিউ তৈরি করেন (যেমন, Button myButton = new Button();), আপনাকে কল করতে হবেsetLayoutParams আপনার নতুন নির্মিত শিশুটিকে পিতামাতার দৃশ্যে যুক্ত করার আগে আপনাকে প্যারেন্ট ভিউ'র লেআউটপ্যারাম অভ্যন্তর শ্রেণীর একটি উদাহরণ দিয়ে যেতে হবে constructed

উদাহরণস্বরূপ, onCreate()আপনার লিনিয়ারলআউট আইডি রয়েছে ধরে ধরে আপনার ফাংশনে নিম্নলিখিত কোড থাকতে পারে R.id.main:

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

লেআউটপ্যারাম সেট করা নিশ্চিত করা গুরুত্বপূর্ণ। প্রতিটি দৃশ্যের জন্য কমপক্ষে একটি বিন্যাস_ প্রস্থ এবং একটি বিন্যাস_ উচ্চ পরামিতি প্রয়োজন। সঠিক অভ্যন্তর শ্রেণি প্রাপ্ত গুরুত্বপূর্ণ। আমি টেবিলরোতে লেভেলপ্যারামের কোনও উদাহরণ শিশু সন্তানের দৃশ্যের সেটলয়আউটপ্যারামগুলিতে পাস করছি না তা সঠিকভাবে প্রদর্শন করতে একটি টেবিলরোতে ভিউ যুক্ত করার চেষ্টা করেছি।


5
আপনি কীভাবে প্রোগ্রামটিমেটিকভাবে ভিউ তৈরি করবেন কিন্তু এক্সএমএল লেআউট ফাইলটি ব্যবহার করে আপনি এই নতুন দর্শনের জন্য বিশেষভাবে লিখেছেন?
এসকে 9

9
@ এসকে 9 আপনি একটি লেআউটআইনফ্লেটার ব্যবহার করবেন, যা আপনি সাধারণত একটি প্রসঙ্গ, বর্তমান ক্রিয়াকলাপ থেকে পেতে পারেন। এর মতো কিছু: লেআউটআইনফ্লেটার myInflater = getLayoutInflater; আমারভিউ = myInflater.inflate দেখুন (R.layout.myLayout, পিতামাতার, মিথ্যা);
ব্রায়ান কুলি

1
আসলে getLayoutInflater () উইন্ডো শ্রেণি থেকে আসে (প্রসঙ্গ নয়), এবং এটি ক্রিয়াকলাপে একটি সুবিধা পদ্ধতি convenience
ব্রায়ান কুলি

2
কোডিং অনুশীলন হিসাবে, ফাইন্ডভিউআইআইডি-তে, ভিউগ্রুপে ফেলে দেওয়া বা সর্বদা কোনও জিনিসের সর্বাধিক জেনেরিক ফর্ম যাতে এটি লিনিয়ারলআউট থেকে কোনও রিলেটিভলআউটে পরিবর্তিত হয়, আপনার কোনও রিফ্যাক্টরিং নেই।
জোয়েল টেপ্লি

1
এগুলি কয়েকটি বিশদ: ডি
বিবেক সোলঙ্কি

51

এখনও আগ্রহী কারও জন্য:

আমি যে সবচেয়ে ভাল উপায় পেয়েছি তা হ'ল ভিউয়ের স্ফীত স্ট্যাটিক পদ্ধতিটি ব্যবহার করা।

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

যেখানে আপনার ভিউএক্সএক্সএমএল হ'ল আর.লাইআউট.মিভিউয়ের মতো

দয়া করে লক্ষ্য করুন যে একটি ভিউ যুক্ত করার জন্য আপনার একটি ভিউগ্রুপ দরকার (যা আপনি ভাবতে পারেন এমন কোনও বিন্যাস)

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

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);

আপনি একটি স্থিতিশীল পদ্ধতিও লিখতে পারেন, এর মতো কিছু addView(View v){ // your code after get view }ব্যবহার করে findViewById(int resourceID)আপনার মতো স্ফীত বা স্ফীত হওয়া দেখা যাবে inflatedView... কেবল আপনার খণ্ডের উদাহরণটি প্রসারিত করতে।
zgc7009

22

এটি দেরিতে হলেও এটি কাউকে সহায়তা করতে পারে :) :) ভিউ যোগ করার জন্য প্রোগ্রাম্যাটিকভাবে পছন্দ করুন try

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

এটি আপনার সম্পূর্ণ ভিউ প্রোগ্রাম্যাটিকভাবে তৈরি করবে। আপনি যেকোন সংখ্যক ভিউ একই হিসাবে যুক্ত করতে পারেন। আশা করি এটি সাহায্য করতে পারে। :)



3

ক্রিয়াকলাপ থেকে দর্শন যোগ করার আরও একটি উপায়

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

0

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

আপনার যা করতে হবে তা হল addChild()পদ্ধতিটি ব্যবহার করে ফ্রেমলআউটে শিশু হিসাবে এটিকে দেখার জন্য inf তারপরে রানটাইমের সময় আপনার দর্শন ফুলে উঠবে এবং সঠিক অবস্থানে রাখা হবে। অ্যান্ড্রয়েডের প্রতি পরামর্শ অনুযায়ী আপনার ফ্রেমলাউট [লিঙ্ক] এ কেবলমাত্র একটি চাইল্ডভিউ যুক্ত করা উচিত ।

আপনার কোডটি দেখতে কেমন হবে তা মনে করে আপনি কোনও নির্দিষ্ট অবস্থানে প্রোগ্রাম্যাটিকভাবে টেক্সটভিউ তৈরি করতে চান:

ধাপ 1:

আপনার লেআউটে যা ভিউতে স্ফীত হতে পারে, সঠিক ফ্রেমে একটি ফ্রেমলাউট রাখুন এবং একটি আইডি দিন, "ধারক" বলুন।

পদক্ষেপ 2 রানটাইম চলাকালীন আপনি যে ভিউটি বাড়িয়ে তুলতে চান সেই হিসাবে মূল উপাদানটির সাথে একটি বিন্যাস তৈরি করুন, লেআউট ফাইলটিকে "টেক্সটভিউ.এক্সএমএল" হিসাবে কল করুন:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

</TextView>

বিটিডাব্লু, আপনার ফ্রেমের লেআউট-প্যারামগুলি সেট করে রাখুন লেপআউটটি সর্বদা র‌্যাপ_কন্টেন্টে রাখুন অন্যথায় ফ্রেম লেআউটটি প্যারেন্টের মতো বড় হয়ে যাবে অর্থাৎ ক্রিয়াকলাপ অর্থাৎ ফোনের স্ক্রিন।

android:layout_width="wrap_content"
android:layout_height="wrap_content"

যদি সেট না করা থাকে, কারণ ডিফল্টরূপে ফ্রেমের একটি শিশু দর্শন ফ্রেম বিন্যাসের বাম-শীর্ষে যায়, সুতরাং আপনার দৃশ্যটি কেবল স্ক্রিনের বাম দিকে চলে যাবে।

ধাপ 3

আপনার oncreate পদ্ধতিতে, এটি করুন:

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

(নোট করুন যে কনটেইনার ভিউতে কল করে শেষ পরামিতি সেট findViewByIdকরা nullএবং addView()ভিউ যুক্ত করা (ফ্রেমলআউট) কেবল trueতৃতীয় প্যারামিটারে পাস করে ফুলে যাওয়া ভিউ সংযুক্ত করার সমান is findViewById()আরও দেখুন এটি দেখুন ))


0

onLayoutআপনার ছেলেরাও নিশ্চিত হওয়া উচিত যে আপনি যখন super.onLayoutসমস্ত বৈশিষ্ট্যের সাথে কল করার জন্য আপনাকে ওভাররাইড করবেন তখন বা দৃশ্যটি স্ফীত হবে না!

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