এক্সএমএল লেআউটে অ্যান্ড্রয়েডের <নিমজ্জনিত ট্যাগটির উদ্দেশ্য কী?


325

আমি পড়েছি রোমাঁ গাই এর পোস্ট উপর <merge />ট্যাগ, কিন্তু আমি এখনও বুঝতে পারছি না কিভাবে এটা দরকারী। এটি কি <Frame />ট্যাগের বাছাইয়ের ধরণের , বা এটি এর মতো ব্যবহার করা হয়:

<merge xmlns:android="....">
<LinearLayout ...>
    .
    .
    .
</LinearLayout>
</merge>

তারপরে <include />অন্য একটি ফাইলের কোড?

উত্তর:


584

<merge/> এটি দরকারী কারণ এটি অনিবদ্ধ ভিউগ্রুপগুলি থেকে মুক্তি পেতে পারে, অর্থাত্ অন্যান্য বিন্যাসগুলি মোড়ানোর জন্য এবং বিনা উদ্দেশ্যতে নিজেরাই পরিবেশন করতে ব্যবহৃত লেআউটগুলি।

উদাহরণস্বরূপ, আপনি যদি <include/>মার্জ না করেই অন্য কোনও ফাইল থেকে কোনও বিন্যাসে পৌঁছেছিলেন তবে দুটি ফাইলই এর মতো দেখতে পারে:

layout1.xml:

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml:

<FrameLayout>
   <TextView />
   <TextView />
</FrameLayout>

যা কার্যকরীভাবে এই একক বিন্যাসের সমতুল্য:

<FrameLayout>
   <FrameLayout>
      <TextView />
      <TextView />
   </FrameLayout>
</FrameLayout>

লেআউট 2.xML এ ফ্রেমলআউটটি কার্যকর নাও হতে পারে। <merge/>এটি থেকে মুক্তি পেতে সহায়তা করে। মার্জ ব্যবহার করে দেখতে কেমন লাগে তা এখানে (লেআউট 1.এক্সএমএল পরিবর্তন হয় না):

layout2.xml:

<merge>
   <TextView />
   <TextView />
</merge>

এটি কার্যত এই লেআউটের সমতুল্য:

<FrameLayout>
   <TextView />
   <TextView />
</FrameLayout>

তবে যেহেতু আপনি ব্যবহার করছেন <include/>আপনি লেআউটটি অন্য কোথাও পুনরায় ব্যবহার করতে পারেন। এটি কেবল ফ্রেম-লেআউটগুলি প্রতিস্থাপনের জন্য ব্যবহার করতে হবে না - আপনি যে কোনও বিন্যাস প্রতিস্থাপন করতে এটি ব্যবহার করতে পারেন যা আপনার দর্শন দেখতে / আচরণ করে এমনভাবে কোনও উপকারী কিছু যুক্ত করছে না।


17
এই উদাহরণে আপনি শুধু layout2.xml মাত্র ধারণ করতে পারে <TextView />, অন্য কিছু না।
কারু

21
সত্য, লেআউট 2 এর পরিবর্তে একটি সাধারণ টেক্সটভিউ ব্যবহার করা যেতে পারে, তবে এটি তখন সম্পূর্ণ আলাদা জিনিস হবে এবং এই প্রশ্নের উত্তরের উদাহরণ হিসাবে দরকারী নয়।
ডেভ

<অন্তর্ভুক্ত> ট্যাগের সাথে একত্রে <ডর্ম> ট্যাগ ব্যবহার করা সর্বদা কার্যকর is
আনশুল

38
@ কারু: আপনি ঠিক বলেছেন, এই উদাহরণে মার্জ ট্যাগটি প্রয়োজনীয় নয় তবে এটি কেবল কারণ লেআউট 2 তে একটি উপাদান রয়েছে। যদি লেআউট 2 এর একাধিক উপাদান থাকে, তবে এটির বৈধ এক্সএমএল হওয়ার জন্য একটি মূল নোড থাকতে হবে এবং এটিই যখন মার্জ ট্যাগটি কার্যকর হয়।
gMale

3
সুতরাং <ডর্ম> এর উল্লম্ব অবস্থান বা অনুভূমিকটি কীভাবে নির্দিষ্ট করবেন? এবং কীভাবে আপনি একটি লেআউট_ ওয়েট দেন?
ইগোরগানাপলস্কি

304

অন্তর্ভুক্ত ট্যাগ

<include>ট্যাগ আপনি একাধিক ফাইল মধ্যে আপনার লেআউট বিভক্ত করতে দেয়: এটা সঙ্গে তার আচরণ করতে সাহায্য করে জটিল বা সুদীর্ঘ ইউজার ইন্টারফেস।

ধরুন আপনি নীচে দুটি অন্তর্ভুক্ত ফাইল ব্যবহার করে আপনার জটিল বিন্যাসটি বিভক্ত করেছেন:

শীর্ষ_ত্যাগী_অ্যাক্টিভিটি.এক্সএমএল :

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

    <!-- First include file -->
    <include layout="@layout/include1.xml" />

    <!-- Second include file -->
    <include layout="@layout/include2.xml" />

</LinearLayout>

তাহলে আপনার লিখতে হবে include1.xmlএবং include2.xml

মনে রাখবেন যে অন্তর্ভুক্ত করা ফাইলগুলি থেকে এক্সএমএল কেবলমাত্র উপস্থাপনের সময় আপনার লেআউটে ফেলে দেওয়া হয় top_level_activity(বেশিরভাগ #INCLUDEক্ষেত্রে সি এর জন্য ম্যাক্রোর মতো )।

অন্তর্ভুক্ত ফাইলগুলি হ'ল প্লেইন জেন লেআউট এক্সএমএল।

অন্তর্ভুক্ত 1.xML :

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:text="First include"
    android:textAppearance="?android:attr/textAppearanceMedium"/>

... এবং অন্তর্ভুক্ত 2.xML :

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button1"
    android:text="Button" />

দেখা? অভিনব কিছু না। মনে রাখবেন যে আপনাকে এখনও অ্যান্ড্রয়েড নেমস্পেসের সাথে ঘোষণা করতে হবে xmlns:android="http://schemas.android.com/apk/res/android

সুতরাং শীর্ষ_মোহিত_অ্যাক্টিভিটি.এক্সএমএল এর রেন্ডার সংস্করণটি হ'ল:

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

    <!-- First include file -->
    <TextView
        android:id="@+id/textView1"
        android:text="First include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <!-- Second include file -->
    <Button
        android:id="@+id/button1"
        android:text="Button" />


</LinearLayout>

আপনার জাভা কোডে, এই সমস্ত স্বচ্ছ: findViewById(R.id.textView1)আপনার ক্রিয়াকলাপ শ্রেণিতে সঠিক উইজেটটি ফেরত দেয় (এমনকি যদি সেই উইজেটটি কোনও ক্রিয়াকলাপের বিন্যাসের চেয়ে আলাদা কোনও এক্সএমএল ফাইলে ঘোষিত হয়েছিল)।

এবং উপরে চেরি: ভিজ্যুয়াল এডিটরটি সাঁতার দিয়ে জিনিসটি পরিচালনা করে। শীর্ষ স্তরের বিন্যাসটি অন্তর্ভুক্ত এক্সএমএল সহ রেন্ডার করা হয়।

চক্রান্ত thickens

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

এর include1.xmlএখন দুটি আছে বলে দিন TextView: একটি বিন্যাস ঘোষণা করতে হবে। আসুন একটি নির্বাচন করা যাক LinearLayout

অন্তর্ভুক্ত 1.xML :

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

    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

</LinearLayout>

Top_level_activity.xml যেমন অনুষ্ঠিত হবে:

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

    <!-- First include file -->
    <LinearLayout 
        android:id="@+id/layout2" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

       <TextView
            android:id="@+id/textView1"
            android:text="Second include"
            android:textAppearance="?android:attr/textAppearanceMedium"/>

       <TextView
            android:id="@+id/textView2"
            android:text="More text"
            android:textAppearance="?android:attr/textAppearanceMedium"/>

   </LinearLayout>

     <!-- Second include file -->
   <Button
        android:id="@+id/button1"
        android:text="Button" />

</LinearLayout>

তবে অপেক্ষার দুই স্তরের LinearLayoutঅপ্রয়োজনীয় !

প্রকৃতপক্ষে, দু'টি নেস্টেড LinearLayoutকোনও উদ্দেশ্য করে না কারণ একই রেন্ডারিংয়ের জন্য দু'টিকে TextViewঅন্তর্ভুক্ত করা যেতে পারে ।layout1

তাহলে আমরা কি করতে পারি?

মার্জ ট্যাগ প্রবেশ করান

<merge>ট্যাগ মাত্র একটি ডামি ট্যাগ যা অতিরেক সমস্যা এই ধরনের মোকাবিলা করার জন্য একটি শীর্ষ স্তরের উপাদান প্রদান করে।

এখন অন্তর্ভুক্ত 1.xML হয়ে যায়:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

</merge>

এবং এখন top_level_activity.xML কে রেন্ডার করা হয়েছে:

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

    <!-- First include file --> 
    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <!-- Second include file -->
    <Button
        android:id="@+id/button1"
        android:text="Button" />

</LinearLayout>

আপনি একটি স্তরক্রম স্তর সংরক্ষণ করেছেন, একটি অকেজো দৃশ্য এড়ান: রোমেন গাই ইতিমধ্যে আরও ভাল ঘুমায়।

আপনি কি এখন সুখী নন?


23
দুর্দান্ত বর্ণনা।
রিচিএইচএইচ

4
খুব স্পষ্টভাবে ব্যাখ্যা করেছে, উত্তর হিসাবে চয়ন করা উচিত
ললিটম

2
দুর্দান্ত, কোনও সন্দেহ ছাড়াই এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
গৌরব জেইন

1
কিছু বুঝতে পারিনি .. উদাহরণস্বরূপ যদি বাইরের লিনিয়ারলআউটটি উলম্ব হয় তবে অন্তর্ভুক্ত 1.xML এর 2 পাঠ্যদর্শনগুলি অনুভূমিক হওয়ার কথা? এক্ষেত্রে সংযুক্তি তাদের যে লেআউটটি চেয়েছিল তা সংরক্ষণ করে না। এটি সম্পর্কে কি করা যেতে পারে?
যোনাতন নীড়

@ যোনাতনির মিরর আপনার ক্ষেত্রে যা প্রয়োজন তা পরিষ্কার নয়। আপনার যদি সত্যিকারের ভিউয়ের স্তরবিন্যাসকে সমতল করার দরকার হয় তবে সম্ভবত আপনি RelativeLayoutনিজেই মতামতগুলি ব্যবহার করতে পারেন বা আঁকতে পারেন
অভিজিৎ

19

ব্লেজারিণী ইতিমধ্যে এটি বেশ পরিষ্কার করে দিয়েছে, আমি কেবল কয়েকটি পয়েন্ট যুক্ত করতে চাই।

  • <merge> লেআউটগুলি অনুকূলকরণের জন্য ব্যবহৃত হয় unnecessary এটি অপ্রয়োজনীয় বাসা বাঁধার জন্য ব্যবহার করা হয়।
  • যখন একটি লেআউট ধারণকারী <merge>ট্যাগ অন্য লেআউট মধ্যে যোগ করা হয়, <merge>নোড দূরে রাখা হবে এবং তার সন্তান দৃশ্য নতুন পিতা বা মাতা সরাসরি যোগ করা হয়।

10

কী ঘটছে তার আরও গভীর-জ্ঞান থাকতে, আমি নিম্নলিখিত উদাহরণটি তৈরি করেছি। কার্যকলাপ_মাইন.এক্সএমএল এবং কন্টেন্ট_প্রোফাইল.এক্সএমএল ফাইলগুলি দেখুন at

activity_main.xml

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

    <include layout="@layout/content_profile" />

</LinearLayout>

content_profile.xml

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Howdy" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hi there" />

</LinearLayout>

এখানে, পুরো লেআউট ফাইলটি স্ফীত যখন দেখায়।

<LinearLayout>
    <LinearLayout>
        <TextView />
        <TextView />
    </LinearLayout>
</LinearLayout>

দেখুন পিতামাতার লিনিয়ারলআউটের ভিতরে একটি লিনিয়ারালাউট রয়েছে যা কোনও উদ্দেশ্য করে না এবং এটি অনর্থক। লেআউট ইন্সপেক্টর সরঞ্জামের মাধ্যমে বিন্যাসের দিকে নজর দেওয়া এটিকে পরিষ্কারভাবে ব্যাখ্যা করে।

এখানে চিত্র বর্ণনা লিখুন

content_profile.xml LinearLayout মত একটি ViewGroup পরিবর্তে ব্যবহার একত্রীকরণ কোড আপডেট করার পরে।

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Howdy" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hi there" />

</merge>

এখন আমাদের লেআউটটি এটির মতো দেখাচ্ছে

<LinearLayout>
    <TextView />
    <TextView />
</LinearLayout>

এখানে আমরা দেখছি যে অপ্রয়োজনীয় লিনিয়ারলআউট আউট ভিউ গ্রুপটি সরানো হয়েছে। এখন লেআউট ইন্সপেক্টর সরঞ্জামটি নীচের লেআউট স্তরক্রম দেয়।

এখানে চিত্র বর্ণনা লিখুন

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


5

মার্জ ব্যবহারের আর একটি কারণ হ'ল তালিকাগুলি বা গ্রিডভিউতে কাস্টম ভিউগ্রুপগুলি ব্যবহার করার সময়। তালিকার অ্যাডাপ্টারে ভিউহোল্ডার প্যাটার্নটি ব্যবহার না করে আপনি একটি কাস্টম ভিউ ব্যবহার করতে পারেন। কাস্টম ভিউটি এমন কোনও এক্সএমএলকে স্ফীত করে দেবে যার মূলটি একটি মার্জ ট্যাগ। অ্যাডাপ্টারের জন্য কোড:

public class GridViewAdapter extends BaseAdapter {
     // ... typical Adapter class methods
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
        WallpaperView wallpaperView;
        if (convertView == null)
           wallpaperView = new WallpaperView(activity);
        else
            wallpaperView = (WallpaperView) convertView;

        wallpaperView.loadWallpaper(wallpapers.get(position), imageWidth);
        return wallpaperView;
    }
}

এখানে কাস্টম ভিউগ্রুপ রয়েছে:

public class WallpaperView extends RelativeLayout {

    public WallpaperView(Context context) {
        super(context);
        init(context);
    }
    // ... typical constructors

    private void init(Context context) {
        View.inflate(context, R.layout.wallpaper_item, this);
        imageLoader = AppController.getInstance().getImageLoader();
        imagePlaceHolder = (ImageView) findViewById(R.id.imgLoader2);
        thumbnail = (NetworkImageView) findViewById(R.id.thumbnail2);
        thumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }

    public void loadWallpaper(Wallpaper wallpaper, int imageWidth) {
        // ...some logic that sets the views
    }
}

এবং এটি এক্সএমএল:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView
        android:id="@+id/imgLoader"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerInParent="true"
        android:src="@drawable/ico_loader" />

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</merge>

আপনি কি বোঝাচ্ছেন যে আপনি যদি আপনার এক্সএমএল ফাইলে একটি রিলেটিভলআউট এবং আপনার কাস্টম ভিউগ্রুপকে রিলেটিভলআউট থেকে উত্তরাধিকার সূত্রে ব্যবহার করেন তবে সেখানে দুটি রিলেটিভ লেআউট থাকবে, একজন অন্যটিতে বাসা বাঁধে?
স্কট বিগস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.