লেআউটআইনফ্লেটার আমার নির্দিষ্ট করা লেআউট_পথ এবং লেআউট_উইচ লেআউট পরামিতিগুলিকে কেন উপেক্ষা করবে?


167

লেআউটআইনফ্লেটারকে প্রত্যাশা অনুযায়ী কাজ করতে পেয়ে আমার প্রচণ্ড সমস্যা হয়েছিল এবং অন্যান্য লোকেরাও: রানটাইমটিতে ভিউ যুক্ত করতে লেআউটইনফ্লেটার কীভাবে ব্যবহার করবেন?

আমি যে লেআউট পরামিতিগুলি নির্দিষ্ট করেছি তা লেআউটআইনফ্লেটার কেন উপেক্ষা করবে? উদাহরণস্বরূপ কেন আমার সংস্থানসমূহের এক্সএমএল থেকে প্রাপ্ত মান layout_widthএবং layout_heightমানগুলি সম্মানিত হয় না?


সত্য- এতে কি আঘাত লাগে নাকি আমি ভুল জায়গাটি বেছে নিয়েছি? ভেবেছি আমি আমার ফলাফলগুলি ভাগ করব। টিউটোরিয়ালগুলি অবশ্যই
FAQ পৃষ্ঠাগুলির

3
প্রথম প্রশ্নের শেষ অনুচ্ছেদটি FAQ এ দেখুন। এটি একটি প্রশ্ন হিসাবে পোস্ট করুন এবং তারপরে উত্তর হিসাবে টিউটোরিয়াল পোস্ট করুন। অবশ্যই, আপনি উত্তরটি টিউটোরিয়ালটি কাটা এবং পেস্ট করে এই প্রশ্নটি সম্পাদনা করতে পারেন। যদি আপনি এটি ঠিক করেন তবে আমি উড়ে যাব।
17-21

উত্তর:


380

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

আমরা শুরু করার আগে LayoutInflater.inflate()প্যারামিটারগুলি দেখতে কেমন তা দেখুন:

  • রিসোর্স : লোড করার জন্য এক্সএমএল লেআউট রিসোর্সের আইডি (যেমন, R.layout.main_page)
  • রুট : উত্পন্ন হায়ারার্কির পিতামাতা হতে parentচ্ছিক দৃষ্টিভঙ্গি (যদি attachToRootহয় true), অথবা অন্যথায় কেবল এমন একটি বস্তু যা LayoutParamsপ্রত্যাবর্তিত শ্রেণিবিন্যাসের মূলের মান সরবরাহ করে (যদি attachToRootহয় false)
  • AttToRoot : স্ফীতিত স্তরক্রমটি মূল প্যারামিটারের সাথে সংযুক্ত করা উচিত? যদি মিথ্যা LayoutParamsহয় তবে এক্সএমএলটিতে মূল দেখার জন্য মূলটি কেবলমাত্র সাবক্লাস তৈরি করতে ব্যবহৃত হয় ।

  • রিটার্নস : স্ফীত শ্রেণিবিন্যাসের মূল দৃশ্য। যদি মূল সরবরাহ করা হয় এবং attachToRootহয় trueতবে এটি মূল; অন্যথায় এটি স্ফীত এক্সএমএল ফাইলের মূল।

এখন নমুনা বিন্যাস এবং কোড জন্য।

প্রধান বিন্যাস ( main.xml):

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

এই ধারকটিতে যুক্ত করা হয়েছে একটি পৃথক পাঠ্যদর্শন, XML ( red.xml) থেকে যদি লেআউট প্যারামিটারগুলি সফলভাবে প্রয়োগ করা হয় তবে ছোট লাল স্কোয়ার হিসাবে দৃশ্যমান :

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:background="#ff0000"
    android:text="red" />

LayoutInflaterকল পরামিতিগুলির বিভিন্ন প্রকারের সাথে এখন ব্যবহৃত হয়

public class InflaterTest extends Activity {

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      ViewGroup parent = (ViewGroup) findViewById(R.id.container);

      // result: layout_height=wrap_content layout_width=match_parent
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view);

      // result: layout_height=100 layout_width=100
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view, 100, 100);

      // result: layout_height=25dp layout_width=25dp
      // view=textView due to attachRoot=false
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
      parent.addView(view);

      // result: layout_height=25dp layout_width=25dp 
      // parent.addView not necessary as this is already done by attachRoot=true
      // view=root due to parent supplied as hierarchy root and attachRoot=true
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
    }
}

পরামিতি পরিবর্তনের প্রকৃত ফলাফলগুলি কোডটিতে নথিভুক্ত হয়।

সারমর্ম: কলিং LayoutInflaterফোলান কলে রুট বিশালাকার উল্লেখ XML থেকে বিন্যাস পরামিতি উপেক্ষা ছাড়া। রুটের সাথে স্ফীত কলিংটি সমান নয় nullএবং attachRoot=trueলেআউট প্যারামিটারগুলি লোড করে না , তবে আবার রুট অবজেক্টটি ফেরত দেয়, যা লোড হওয়া অবজেক্টে পরবর্তী লেআউট পরিবর্তনগুলি প্রতিরোধ করে (যদি না আপনি এটি ব্যবহার না করে findViewById()) can আপনি সম্ভবত কলিং কনভেনশনটি ব্যবহার করতে চান তাই এটি একটি:

loadedView = LayoutInflater.from(context)
                .inflate(R.layout.layout_to_load, parent, false);

বিন্যাস সংক্রান্ত সমস্যাগুলির সাথে সহায়তা করার জন্য, লেআউট ইন্সপেক্টরকে অত্যন্ত প্রস্তাব দেওয়া হয়।


20
দুর্দান্ত উত্তর। 3 বছর ধরে অ্যান্ড্রয়েডে কাজ করা এবং গণনা করা এবং এখনও এ থেকে কিছু শেখার ছিল।
রূবেন স্ক্র্যাটন

হাই কি আর জাফল কোড দিয়ে আর.লেআউট এর সাথে স্ফীত করার পরিবর্তে একই কাজ করার কোনও উপায় নেই। কারণ আমার লেআউট নেই। আমি জাভা কোড দিয়ে ভিউ তৈরি করেছি এবং আমি একই মত 300 বার যুক্ত করতে চাই।
রাজ

1
@andig: Activityএর উপশ্রেণী হয় Contextএবং উত্তর এর উদাহরণ সুযোগ রয়েছে Activityতাই এটি সহজ আমি প্রতিস্থাপিত করা, getBaseContext()সঙ্গে thisহিসাবে, এই উত্তর অনুরোধে জন্য, এটা সমতুল্য নয়।
মার্সিন ওরোলোস্কি

5
ধারকটির বিন্যাস_ প্রস্থ এবং লেআউট_উইটটি "ম্যাচ_পিতা" তে সেট করা আছে; তারপরে মন্তব্য বলছে "// ফলাফল: বিন্যাস_ উচ্চতা = মোড়ানো_কন্টেন্ট লেআউট_ প্রস্থ = ম্যাচ_প্যারেন্ট"। আমি কি স্টাচ মিস করছি?
মারিয়ান পাডজিওচ

1
গবেষণা এবং ফলাফল ভাগ করে নেওয়ার জন্য ধন্যবাদ! এছাড়াও, আমি দ্বিতীয় মারিয়ানের প্রশ্ন।
লার্শ

5

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

আমি এ সম্পর্কে একটি গভীর-ব্লগ পোস্ট লিখেছিলাম যা আপনি এখানে পরীক্ষা করে দেখতে পারেন:

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


1
This is acceptable for a few scenarios such as a dialogআমার যা প্রয়োজন তা
হ'ল

0

উপরের মূল উত্তরে যোগ করতে চাই
আমি এটি অনুসরণ করার চেষ্টা করেছি তবে আমার পুনর্ব্যবহারকারী ভিউ প্রতিটি আইটেমটি একটি স্ক্রিনে প্রসারিত করতে শুরু করে
আমি লক্ষ্যে পৌঁছানোর জন্য স্ফীত করার পরে পরবর্তী লাইনটি যুক্ত করতে হয়েছিল

itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));

আমি ইতিমধ্যে এক্সএমএল দ্বারা এই প্যারামগুলি যুক্ত করেছি তবে এটি সঠিকভাবে কাজ করে না
এবং এই লাইনের সাথে সমস্ত ঠিক আছে

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