লেআউটআইনফ্লেটার সংযুক্তি টুরোট পরামিতিটির অর্থ কী?


201

LayoutInflater.inflateডকুমেন্টেশন ঠিক উদ্দেশ্য সম্পর্কে আমাকে পরিষ্কার করা হয় না attachToRootপ্যারামিটার।

AttToRoot : স্ফীত শ্রেণিবিন্যাসটি মূল প্যারামিটারের সাথে সংযুক্ত করা উচিত? যদি মিথ্যা হয় তবে এক্সএমএলটিতে মূল দেখার জন্য লেআউটপ্যারামগুলির সঠিক সাবক্লাস তৈরি করতে মূল ব্যবহার করা হয়।

কেউ দয়া করে আরও বিশদে বিশদভাবে ব্যাখ্যা করতে পারেন, বিশেষভাবে মূল দৃষ্টিভঙ্গিটি কী এবং সম্ভবত trueএবং falseমানগুলির মধ্যে আচরণের পরিবর্তনের একটি উদাহরণ দেখাতে পারে ?


1
সম্পর্কিত:
লেআউটআইনফ্লেটার

উত্তর:


157

এখনই বা না এখন

সত্য বা মিথ্যা "তৃতীয়" পরামিতি সংযুক্তিটোররটের মধ্যে প্রধান পার্থক্য এটি।

যখন আপনি সংযুক্তিআরআউট রাখবেন

সত্য: সন্তানের দৃষ্টিভঙ্গিকে পিতামাতার সাথে যুক্ত করুন এখনই
মিথ্যা: এখনই নয় পিতামাতার সাথে সন্তানের দৃষ্টিভঙ্গি যুক্ত করুন ।
এটি পরে যুক্ত করুন। `

পরে কবে ?

এটি পরে যখন আপনি উদাহরণস্বরূপ ব্যবহার করেন parent.addView(childView)

একটি সাধারণ ভ্রান্ত ধারণাটি হ'ল, যদি সংযুক্তি টু রুট প্যারামিটারটি মিথ্যা হয় তবে সন্তানের দৃষ্টিভাকে পিতামাতার সাথে যুক্ত করা হবে না। ভুল
উভয় ক্ষেত্রে, পিতা-মাতার ভিউতে শিশু দর্শন যুক্ত করা হবে। এটা এখন সময়ের বিষয় মাত্র ।

inflater.inflate(child,parent,false);
parent.addView(child);   

সমতুল্য

inflater.inflate(child,parent,true);

একটি বড়
কোন- NO আপনি সন্তানের দর্শন পিতামাতার সাথে যুক্ত করার জন্য দায়বদ্ধ না হলে আপনার কখনও সংযুক্তি - রুটকে সত্য হিসাবে পাস করা উচিত নয়।
যেমন খণ্ড যুক্ত করার সময়

public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle bundle)
  {
        super.onCreateView(inflater,parent,bundle);
        View view = inflater.inflate(R.layout.image_fragment,parent,false);
        .....
        return view;
  }

যদি আপনি সত্য হিসাবে তৃতীয় প্যারামিটারটি পাস করেন তবে আপনি এই লোকটির কারণে অবৈধ স্টাট এক্সেক্সশন পাবেন।

getSupportFragmentManager()
      .beginTransaction()
      .add(parent, childFragment)
      .commit();

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

দ্রষ্টব্য: আমি আরও পড়েছি যে প্যারেন্টভিউ চাইল্ডভিউ টাচঅ্যাভেটস পাবেন না যদি সংযুক্তি টুরোটটি মিথ্যা থাকে। তবে আমি যদিও এটি পরীক্ষা করিনি।


6
খুব সহায়ক, বিশেষত অংশটি FragmentManager, আপনাকে ধন্যবাদ!
সাইবেএক্স

94

যদি সত্য হিসাবে সেট করা থাকে তবে যখন আপনার বিন্যাসটি স্ফীত হবে তখন এটি স্বয়ংক্রিয়ভাবে শিশু হিসাবে ২ য় প্যারামিটারে উল্লিখিত ভিউগ্রুপের ভিউ হায়ারার্কিতে স্বয়ংক্রিয়ভাবে যুক্ত হবে। উদাহরণস্বরূপ, যদি রুট প্যারামিটারটি একটি ছিল LinearLayoutতবে আপনার স্ফীত দর্শনটি স্বয়ংক্রিয়ভাবে সেই ভিউয়ের শিশু হিসাবে যুক্ত হবে।

যদি এটি মিথ্যাতে সেট করা থাকে তবে আপনার বিন্যাসটি স্ফীত হবে তবে অন্য কোনও লেআউটের সাথে সংযুক্ত হবে না (যাতে এটি আঁকানো হবে না, স্পর্শ ইভেন্টগুলি গ্রহণ করুন ইত্যাদি)।


17
আমি বিভ্রান্ত আমি যতক্ষণ না আমি পড়তে "নির্দিষ্ট উপ ইতিমধ্যে একটি পিতা বা মাতা ত্রুটি আছে" পেয়ে ছিল এই উত্তর , যা নির্দেশ আমার ব্যবহার করতে falseজন্য attachToRootআমার অসম্পূর্ণ অংশ এর দশকে onCreateView। এই সমস্যা এবং এখনো টুকরা এর লেআউট, দৃশ্যমান এবং সক্রিয় আপনার উত্তর সত্ত্বেও সমাধান। কী হচ্ছে এখানে?
জেফ অ্যাক্সেল্রড

67
কারণ কোনও খণ্ডটি স্বয়ংক্রিয়ভাবে অনক্রিটভিউ থেকে ফিরে আসা লেআউটটিকে সংযুক্ত করে। সুতরাং আপনি যদি এটি অনক্রিটভিউতে ম্যানুয়ালি সংযুক্ত করেন তবে আপনার দৃষ্টিভঙ্গি 2 জন পিতা-মাতার সাথে সংযুক্ত হয়ে যায় (যা আপনি উল্লেখ করেছেন ত্রুটিটি উত্পন্ন করে)।
জোসেফ আর্ল

11
আমি এখানে কিছুটা বিভ্রান্ত হয়েছি, @ জোসেফআরল আপনি বলেছেন যদি সেট করা থাকে trueতবে ভিউটি ২ য় প্যারামিটারের সাথে সংযুক্ত করা হয় যা এটি হয় containerতবে আপনি বলেন যে খণ্ডটি স্বয়ংক্রিয়ভাবে সংযুক্ত আছে onCreateView(), তাই আমার বোঝার সাথে তৃতীয় প্যারামিটারটি অকেজো এবং সেট করা উচিত falseসর্বদা?
আনমલ્ટটিমিও

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

7
@ আনমুলটিমিডিয়ো এটির দ্বারা ফিরে আসা মূল দেখার জন্য কেবল অকেজো onCreateView। যদি আপনি সেই মূল দৃশ্যে আরও বিন্যাসগুলি স্ফীত করেন বা আপনি অন্য কোনও প্রসঙ্গে (যেমন কোনও ক্রিয়াকলাপে) স্ফীত করছেন তবে এটি কার্যকর।
জোসেফ আর্ল

36

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

যদি সত্য হিসাবে সেট করা থাকে তবে যখন আপনার বিন্যাসটি স্ফীত হবে তখন এটি স্বয়ংক্রিয়ভাবে শিশু হিসাবে ২ য় প্যারামিটারে উল্লিখিত ভিউগ্রুপের ভিউ হায়ারার্কিতে স্বয়ংক্রিয়ভাবে যুক্ত হবে।

কোডটিতে আসলে এর অর্থ কী (বেশিরভাগ প্রোগ্রামাররা এটি বোঝে):

public class MyCustomLayout extends LinearLayout {
    public MyCustomLayout(Context context) {
        super(context);
        // Inflate the view from the layout resource and pass it as child of mine (Notice I'm a LinearLayout class).

        LayoutInflater.from(context).inflate(R.layout.child_view, this, true);
    }
}

লক্ষ্য করুন যে আগের কোড বিন্যাস যোগ করা হয় R.layout.child_viewসন্তান হিসাবে MyCustomLayoutকারণ attachToRootPARAM হয় trueএবং নির্ধারণ ঠিক একই ভাবে পিতা বা মাতা লেআউট প্যারাম যেন আমি ব্যবহার করা হবে addViewপ্রোগ্রামেটিক্যালি, অথবা যদি আমি XML- এর করেছে:

<LinearLayout>
   <View.../>
   ...
</LinearLayout>

যখন ক্ষণস্থায়ী নিম্নলিখিত কোড দৃশ্যকল্প ব্যাখ্যা attachRootহিসাবে false:

LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
    // Create a stand-alone view
View myView = LayoutInflater.from(context)
    .inflate(R.layout.ownRootView, null, false);
linearLayout.addView(myView);

পূর্ববর্তী কোডে আপনি উল্লেখ করেছেন যে আপনি myViewএটির নিজস্ব মূল অবজেক্ট হতে চেয়েছিলেন এবং এটি কোনও পিতামাতার সাথে সংযুক্ত করবেন না, পরে আমরা এটির অংশ হিসাবে যুক্ত করেছি LinearLayoutতবে এক মুহুর্তের জন্য এটি স্থির-একাকী (কোনও পিতামাতার নয়) দৃশ্য ছিল।

টুকরাগুলির সাথে একই জিনিস ঘটে, আপনি এগুলি ইতিমধ্যে বিদ্যমান গ্রুপে যুক্ত করতে পারেন এবং এর অংশ হতে পারেন, বা কেবলমাত্র পরামিতিগুলি পাস করতে পারেন:

inflater.inflate (R.layout.fraament, নাল, মিথ্যা);

এটির নিজস্ব রুট হবে তা নির্দিষ্ট করতে।


1
সর্বোপরি, এটি সবচেয়ে সহায়ক ছিল।
ওয়াহিব উল হক

26

ডকুমেন্টেশন এবং পূর্ববর্তী দুটি উত্তর যথেষ্ট হওয়া উচিত, আমার কাছ থেকে কিছু ধারণা।

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

প্রথম ক্ষেত্রে attachToRootপ্যারামিটারটি সেট করতে হবে true(বা অনেক সাধারণ inflateপদ্ধতি যা একটি বিন্যাস ফাইল এবং প্যারেন্ট রুট ViewGroup(অ null)) গ্রহণ করে। এক্ষেত্রে Viewপ্রত্যাবর্তনটি কেবল সেই ViewGroupপদ্ধতিতে পাস করা হয়েছিল, ViewGroupএতে স্ফীতিত ভিউয়ের স্তরক্রম যুক্ত হবে।

দ্বিতীয় বিকল্পের জন্য প্রত্যাবর্তন Viewহ'ল ViewGroupবিন্যাস ফাইল থেকে মূল । যদি আপনি include-mergeজুড়ি প্রশ্ন থেকে আমাদের শেষ আলোচনাটি মনে রাখেন তবে এটি mergeসীমাবদ্ধতার অন্যতম কারণ (যখন mergeমূল হিসাবে একটি বিন্যাসের ফাইলটি স্ফীত হয়, আপনাকে অবশ্যই একটি পিতামাতাকে সরবরাহ করতে হবে এবং attachedToRootসেট করতে হবে true)। যদি আপনার কাছে একটি mergeট্যাগ মূলের সাথে একটি বিন্যাস ফাইল থাকে এবং attachedToRootসেট করা থাকে falseতবে inflateপদ্ধতির mergeকোনও সমতুল্য না থাকায় ফিরে আসার কিছুই থাকবে না । এছাড়াও, ডকুমেন্টেশন হিসাবে বলা হয়েছে যে সেটটি inflateসহ সংস্করণটি গুরুত্বপূর্ণ কারণ আপনি সঠিকটির সাথে দর্শনক্রমক্রম তৈরি করতে পারেনattachToRootfalseLayoutParamsপিতামাতার কাছ থেকে এটি কয়েকটি ক্ষেত্রে গুরুত্বপূর্ণ AdapterView, একটি সাবক্লাসের শিশুদের সাথে সবচেয়ে উল্লেখযোগ্য ViewGroup, যার জন্য addView()সেট পদ্ধতিগুলি সমর্থন করে না। আমি নিশ্চিত আপনি getView()পদ্ধতিতে এই লাইনটি ব্যবহার করে স্মরণ করবেন :

convertView = inflater.inflate(R.layout.row_layout, parent, false);

এই লাইনটি নিশ্চিত করে যে স্ফীত R.layout.row_layoutফাইলটি মূলের উপক্লাস সেট LayoutParamsথেকে সঠিক রয়েছে । আপনি যদি এটি না করে থাকেন তবে মূলটি যদি একটি হয় তবে আপনার লেআউট ফাইলটিতে কিছু সমস্যা হতে পারে । এছাড়াও কিছু বিশেষ ও গুরুত্বপূর্ণ আছে এবং আপনি কি নিশ্চিতরূপে তাদের মধ্যে মতামত সঠিক আছে করা উচিত ।AdapterViewViewGroupRelativeLayoutTableLayout/TableRowLayoutParamsLayoutParams


18

আমি নিজেও কি আসল উদ্দেশ্য ছিল বিশৃঙ্খলা শুরু হয়ে গিয়েছিল attachToRootমধ্যে inflateপদ্ধতি। কিছুটা UI অধ্যয়নের পরে, আমি শেষ পর্যন্ত উত্তর পেয়েছি:

পিতা বা মাতা:

এক্ষেত্রে উইজেট / বিন্যাস হ'ল ফাইন্ডভিউআইডি () ব্যবহার করে আপনি যে ভিউ অবজেক্টগুলি স্ফীত করতে চান তা ঘিরে রয়েছে।

attachToRoot:

তাদের পিতামাতার সাথে মতামত সংযুক্ত করে (পিতামাতার শ্রেণিবিন্যাসে এগুলি অন্তর্ভুক্ত করে), সুতরাং যে কোনও স্পর্শ ইভেন্ট যা প্রাপ্তিগুলি পিতামাতার দর্শনে স্থানান্তরিত হবে। এখন এটি পিতামাতার উপর নির্ভর করে যে সে এই ইভেন্টগুলিকে বিনোদন দিতে চায় বা এড়িয়ে যায়। যদি মিথ্যাতে সেট করা থাকে তবে এগুলি পিতামাতার প্রত্যক্ষ সন্তান হিসাবে যুক্ত করা হয় না এবং পিতামাতারা দর্শনগুলি থেকে কোনও স্পর্শ ইভেন্ট পান না।

আশা করি এটি বিভ্রান্তি কেটে যায়


: তুমি উত্তর ইতিমধ্যে এখানে প্রদান করা হয় stackoverflow.com/questions/22326314/...
নিয়ন Warge

11

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

View inflate (int resource, ViewGroup root, boolean attachToRoot)

কটাক্ষপাত activity_main.xml ফাইল, button.xml বিন্যাস এবং MainActivity.java আমার তৈরি ফাইল।

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>

button.xml

<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

MainActivity.java

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

    LayoutInflater inflater = getLayoutInflater();
    LinearLayout root = (LinearLayout) findViewById(R.id.root);
    View view = inflater.inflate(R.layout.button, root, false);
}

যখন আমরা কোডটি চালাই, আমরা বিন্যাসের বোতামটি দেখতে পাব না। এটি কারণ আমাদের বোতাম লেআউটটি মূল ক্রিয়াকলাপের লেআউটে যোগ করা হয়নি, যেহেতু সংযুক্তি-ট্রুটটি মিথ্যাতে সেট করা আছে।

লিনিয়ারলআউটে একটি অ্যাডভিউ (ভিউ ভিউ) পদ্ধতি রয়েছে যা লিনিয়ারলআউটে ভিউ যুক্ত করতে ব্যবহার করা যেতে পারে। এটি মূল ক্রিয়াকলাপের বিন্যাসে বোতামের লেআউট যুক্ত করবে এবং আপনি কোডটি চালানোর সময় বোতামটি দৃশ্যমান করে দেবে।

root.addView(view);

আসুন পূর্ববর্তী লাইনটি সরান, এবং দেখুন যখন আমরা সংযুক্তি-ট্রুটটিকে সত্য হিসাবে সেট করি তখন কী ঘটে।

View view = inflater.inflate(R.layout.button, root, true);

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

সংক্ষিপ্তসারগুলির জন্য সত্য হিসাবে সংযুক্তিট্রুট সেট করার সময় লোকেরা কেন অবৈধ স্ট্যাটেক্সটেকশন পাচ্ছে।

এটি কারণ কোনও খণ্ডের জন্য আপনি ইতিমধ্যে নির্দিষ্ট করেছেন যে আপনার ক্রিয়াকলাপের ফাইলে আপনার খণ্ড লেআউটটি কোথায় রাখবেন।

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .add(R.id.root, fragment)
    .commit();

অ্যাড (int- পিতা বা মাতা, অসম্পূর্ণ অংশ টুকরা) টুকরা যা এর অভিভাবক লেআউটে বিন্যাস রয়েছে যোগ করা হয়েছে। আমরা যদি সংযুক্তি-রুটটিকে সত্য হিসাবে সেট করে রাখি তবে আপনি ইলিজালস্টেট এক্সপেশন পাবেন: নির্দিষ্ট সন্তানের ইতিমধ্যে একটি পিতামাতাই রয়েছে। যেহেতু টুকরা বিন্যাসটি অ্যাড () পদ্ধতিতে প্যারেন্ট লেআউটে ইতিমধ্যে যুক্ত করা হয়েছে।

আপনি যখন টুকরো টুকরো টুকরো টুকরো টানছেন তখন আপনার সর্বদা সংযুক্তিট্রু রুটের জন্য মিথ্যা পাস করা উচিত। টুকরা যোগ করা, অপসারণ এবং প্রতিস্থাপন করা ফ্রেগমেন্টম্যানেজারের কাজ।

আমার উদাহরণ ফিরে। যদি আমরা দুজনেই করি।

View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);

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

মনে রাখবেন যে আরও একটি ওভারলোডেড ইনফ্লেট () পদ্ধতি রয়েছে, যা সংযুক্তি-রূটকে ডিফল্টরূপে সত্য হিসাবে সেট করে।

View inflate (int resource, ViewGroup root)

সহজ এবং স্পষ্ট ব্যাখ্যা, আমি যা খুঁজছিলাম ঠিক সেটাই!
ফ্লাইংএ্যাসিস্টেন্ট

10

স্ফীত () পদ্ধতির ডকুমেন্টেশনের কারণে এই বিষয়ে অনেক বিভ্রান্তি রয়েছে।

সাধারণভাবে, যদি সংযুক্তিআরूटটিকে সত্যতে সেট করা থাকে, তবে প্রথম প্যারামিটারে উল্লিখিত বিন্যাস ফাইলটি স্ফীত হয় এবং সেই মুহূর্তে দ্বিতীয় প্যারামিটারে নির্দিষ্ট ভিউগ্রুপের সাথে সংযুক্ত থাকে। সংযুক্তি-ট্রুটটি মিথ্যা হলে, প্রথম প্যারামিটার থেকে লেআউট ফাইলটি স্ফীত হয় এবং একটি ভিউ হিসাবে ফিরে আসে এবং কোনও ভিউ সংযুক্তি অন্য সময়ে ঘটে।

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

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

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/


4

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

অ্যান্ড্রয়েডে নতুন আইওএস বিকাশকারীদের জন্য, attachToRootসত্য হিসাবে সেট করা মানে আপনি এই পদ্ধতিটি কল করেছেন:

[parent addSubview:inflatedView];

যদি আরও এগিয়ে যেতে পারেন আপনি জিজ্ঞাসা করতে পারেন: আমি সেট attachToRootকরা থাকলে কেন পিতামাতার দৃষ্টিভঙ্গিটি পাস করব false? কারণ আপনার এক্সএমএল গাছের মূল উপাদানটির কিছু লেআউটপ্যারাম (যেমন ম্যাচের পিতামাতার) গণনা করতে প্যারেন্ট ভিউ দরকার।


0

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


1
একটি ভাল উত্তর প্রদান করা উচিত যা একটি পরিষ্কার ছবি দেয় না।
প্রখর 1001

0

উদাহরণস্বরূপ আমরা একটি ImageView, একটি LinearLayoutএবং একটি আছে RelativeLayout। লিনিয়ারলআউট হ'ল রিলেটিভলআউটের সন্তান। ভিউ হায়ারার্কি হবে।

RelativeLayout
           ------->LinearLayout

এবং ইমেজভিউয়ের জন্য আমাদের একটি পৃথক বিন্যাস ফাইল রয়েছে

image_view_layout.xml

মূলের সাথে সংযুক্ত করুন:

//here container is the LinearLayout

    View v = Inflater.Inflate(R.layout.image_view_layout,container,true);
  1. এখানে ভিতে ধারক বিন্যাসের রেফারেন্স রয়েছে যেমন লিনিয়ারলআউট.আর আপনি যদি চিত্রকল্পের মতো প্যারামিটার সেট করতে চান তবে আপনাকে setImageResource(R.drawable.np);এটি পিতামাতার রেফারেন্স দ্বারা খুঁজে পেতে হবে ieview.findById()
  2. V এর পিতা বা মাতা হবেন ফ্রেমলআউট।
  3. লেআউটপ্যারাম ফ্রেমআলআউট হবে।

মূলের সাথে সংযুক্ত নয়:

//here container is the LinearLayout
    View v = Inflater.Inflate(R.layout.image_view_layout,container,false);
  1. এখানে view.setImageResource(R.drawable.np);ভিতে কোনও রেফারেন্স কনটেইনার লেআউট নেই তবে ইমেজভিউয়ের সরাসরি রেফারেন্স যা স্ফীত হয় যাতে আপনি এর পরামিতিগুলি পছন্দ মতো পছন্দ না করে সেট করতে পারেন findViewById। তবে ধারকটি নির্দিষ্ট করা হয়েছে যাতে ইমেজভিউ কনটেইনারটির লেআউটপ্যারাম পায় যাতে আপনি বলতে পারেন যে ধারকটির উল্লেখটি কেবলমাত্র লেআউটপ্যারামের জন্য is
  2. সুতরাং বিশেষ ক্ষেত্রে পিতা বা মাতা নਾਲ হবে।
  3. লেআউটপ্যারামগুলি লিনিয়ারলআউটে হবে।

0

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

যদি সংযুক্তিআরूटটি সত্যতে সেট করা থাকে, তবে প্রথম প্যারামিটারে উল্লিখিত বিন্যাস ফাইলটি স্ফীত হয় এবং দ্বিতীয় প্যারামিটারে বর্ণিত ভিউ গ্রুপের সাথে সংযুক্ত করা হয়।

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

<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>

আমরা এখন প্রোগ্রামটিমে এই বোতামটি একটি খণ্ড বা ক্রিয়াকলাপের ভিতরে লিনিয়ারলআউটটিতে যুক্ত করতে চাই। যদি আমাদের লিনিয়ারলআউট ইতিমধ্যে সদস্য ভেরিয়েবল, এমলাইনারলআউট হয় তবে আমরা কেবল নীচের সাথে বোতামটি যুক্ত করতে পারি:

inflater.inflate(R.layout.custom_button, mLinearLayout, true);

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

AttToRoot টি মিথ্যাতে সেট করুন (মিথ্যা ব্যবহারের প্রয়োজন নেই)

AttachToRoot মিথ্যাতে সেট করা থাকে, তাহলে বিন্যাস প্রথম প্যারামিটার নির্দিষ্ট ফাইল স্ফীত হয় এবং না সংযুক্ত ViewGroup দ্বিতীয় প্যারামিটার নির্দিষ্ট কিন্তু যে স্ফীত দৃশ্য বাবা-মার LayoutParams acquires যা দৃশ্য পিতা বা মাতা সঠিকভাবে মাপসই সক্ষম করে।


আসুন একবার কটাক্ষপাত করা যাক আপনি কখন সংযুক্তি-রুটকে মিথ্যাতে সেট করতে চান। এই দৃশ্যে, স্ফীতকরণের প্রথম প্যারামিটারে নির্দিষ্ট করা ভিউটি এই সময়ে দ্বিতীয় প্যারামিটারে ভিউগ্রুপের সাথে সংযুক্ত থাকে না।

আমাদের বোতামের উদাহরণটি পূর্বের থেকে স্মরণ করুন, যেখানে আমরা একটি লেআউট ফাইল থেকে কাস্টম বোতামটি এমলাইনারলআউটে সংযুক্ত করতে চাই। আমরা এখনও আমাদের বোতামটি এমটিনিআরআলআউটে সংযুক্ত করতে পারি অ্যাচটিটোরোটের জন্য মিথ্যে পাস করে — আমরা কেবল এটি নিজেই পরে তা যুক্ত করি।

Button button = (Button) inflater.inflate(R.layout.custom_button,    mLinearLayout, false);
mLinearLayout.addView(button);

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

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

AttToRoot টি মিথ্যাতে সেট করুন (মিথ্যাটি আবশ্যক)

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

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment =  fragmentManager.findFragmentById(R.id.root_viewGroup);

if (fragment == null) {
fragment = new MainFragment();
fragmentManager.beginTransaction()
    .add(R.id.root_viewGroup, fragment)
    .commit();
}

আপনার ক্রিয়াকলাপে আপনার টুকরোটিকে রূট ভিউগ্রুপ ধারক ধারণ করবে এটি আপনার খণ্ডে অনক্রিটভিউ () এ আপনাকে দেওয়া ভিউ গ্রুপের পরামিতি। আপনি লেআউটইনফ্লেটার.ইনফ্লেটে () এর মধ্যে যে ভিউগ্রুপটি পাস করেছেন এটিও এটি। তবে ফ্রেগমেন্টম্যানেজার আপনার খণ্ডের দর্শন এই ভিউগ্রুপের সাথে সংযুক্ত করবে। আপনি এটি দুটিবার সংযুক্ত করতে চান না। সংযুক্তি-ট্রুটকে মিথ্যা হিসাবে সেট করুন।

public View onCreateView(LayoutInflater inflater, ViewGroup  parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout,     parentViewGroup, false);

return view;
}

যদি আমরা এটি ক্রিয়েটভিউ () এ সংযুক্ত করতে না চাই তবে আমাদের খণ্ড খণ্ডের পিতামাতার ভিউগ্রুপটি প্রথম স্থানে কেন দেওয়া হচ্ছে? স্ফীত () পদ্ধতিটি কেন একটি রুট ভিউগ্রুপকে অনুরোধ করে?

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

লিঙ্ক: https://youtu.be/1Y0LlmTCOkM?t=409


0

এই বিষয়টিতে কাজ করার সময় আমি কিছু পয়েন্টগুলি ভাগ করেছিলাম,

গৃহীত উত্তর ছাড়াও আমি কিছু পয়েন্ট চাই যা কিছুটা সহায়ক হতে পারে।

সুতরাং, যখন আমি সংযুক্তি ট্রুটকে সত্য হিসাবে ব্যবহার করেছি , তখন যে ভিউটি ফিরে এসেছিল তা ভিউগ্রুপ টাইপ ছিল অর্থাত্ পিতামাতার রুট ভিউগ্রুপ যা স্ফীত (লেআউটআর রিসোর্স, ভিউগ্রুপ, সংযুক্তি ট্রুথ) পদ্ধতির জন্য প্যারামিটার হিসাবে পাস হয়েছিল , বিন্যাসটি টাইপ নয় যা পাস হয়েছিল attach মিথ্যা হিসাবে আমরা সেই লেআউটআর রিসোর্সের রুট ভিউগ্রুপের ফাংশন রিটার্ন টাইপ পাই

আমাকে একটি উদাহরণ দিয়ে ব্যাখ্যা করতে দিন:

যদি আমাদের কাছে মূল বিন্যাস হিসাবে লিনিয়ারলআউট থাকে এবং তারপরে আমরা স্ফীত ফাংশনটির মাধ্যমে এতে টেক্সটভিউ যুক্ত করতে চাই ।

তারপর ব্যবহার করে attachToRoot যেমন সত্য ফোলান ফাংশন একটি ফেরৎ দেখুন ধরনের LinearLayout

যখন ব্যবহার করে attachToRoot যেমন মিথ্যা ফোলান ফাংশন একটি ফেরৎ দেখুন ধরনের TextView

আশা করি এই সন্ধানটি কিছুটা সহায়ক হবে ...

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