অ্যান্ড্রয়েড কী: অ্যান্ড্রয়েডে ওয়েটসাম এবং এটি কীভাবে কাজ করে?


উত্তর:


133

প্রতি ডকুমেন্টেশন, android:weightSumসর্বাধিক ওজনের যোগফলকে সংজ্ঞায়িত করে এবং layout_weightস্পষ্টভাবে নির্দিষ্ট না করে সমস্ত শিশুদের যোগফলের সমষ্টি হিসাবে গণনা করা হয় ।

আসুন LinearLayoutওরিয়েন্টেশন এবং এর ImageViewsভিতরে 3 সহ একটি উদাহরণ বিবেচনা করি। এখন আমরা এগুলি ImageViewsসর্বদা সমান স্থান গ্রহণ করতে চাই । এটির জন্য, আপনি layout_weightপ্রতিটিতে ImageView1 টি সেট করতে পারেন এবং weightSumকমেন্টে প্রদর্শিত হিসাবে 3 টি সমান গণনা করা হবে।

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    <!-- android:weightSum="3" -->
    android:orientation="horizontal"
    android:layout_gravity="center">

   <ImageView
       android:layout_height="wrap_content"       
       android:layout_weight="1"
       android:layout_width="0dp"/>
  .....

weightSum কোনও ডিভাইসের জন্য লেআউটটি সঠিকভাবে রেন্ডার করার জন্য দরকারী, আপনি যদি প্রস্থ এবং উচ্চতাটি সরাসরি সেট করেন তবে তা ঘটবে না।


145
এটি উদ্দেশ্যটির ব্যাখ্যা নয় weightSum। আপনার উদাহরণের আচরণটি weightSumবাদ দেওয়াগুলির সাথে অভিন্ন হবে এবং আসলে ওজনসামটিকে সেই দৃশ্যে নির্দিষ্ট করা উচিত নয়। ডকুমেন্টেশন বলছেন,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
জেফ Axelrod

3
@ জেফএক্সেলরোড: এটি "নির্দিষ্ট" করা উচিত নয়? কেন? আমি এর কোন কারণ দেখছি না। সুতরাং আমি কেবল বলব এটি নির্দিষ্ট করার দরকার নেই।
কাবি

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

3
ওয়েটসাম প্যারামিটার সম্পর্কে ভাল ব্যাখ্যা দেখতে পাবেন না, তাই ডক্স থেকে: "এটি উদাহরণস্বরূপ একক শিশুকে মোট উপলব্ধ স্থানের ৫০% দেওয়ার জন্য এটি একটি লেআউট_ ওয়েট ০.৫ ও ওয়েটসামকে ১.০ এ সেট করে ব্যবহার করা যেতে পারে" " বিকাশকারী.অ্যান্ড্রয়েড.
com

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

175

সুপারএম এবং জেফের উত্তরে যুক্ত করা,

লিনিয়ারলআউটে যদি 2 টি ভিউ থাকে তবে প্রথমে 1 এর লেআউট_ ওয়েট সহ দ্বিতীয়টি 2 এর লেআউট_ ওয়েট সহ 2 টি এবং কোনও ওজনসাম নির্দিষ্ট করা হয় না, ডিফল্টরূপে ওয়েটসাম 3 (বাচ্চাদের ওজনের যোগফল) হিসাবে গণনা করা হয় এবং প্রথম দৃশ্যটি স্থানটির 1/3 অংশ নেয় যখন দ্বিতীয়টি 2/3 নেয়।

তবে, যদি আমরা ওয়েটসাম 5 হিসাবে নির্দিষ্ট করে রাখি তবে প্রথম স্থানটির 1/5 তম স্থান গ্রহণ করবে এবং দ্বিতীয়টি 2/5 তম স্থান নেবে। সুতরাং মোট 3/5 স্পেস বাকি খালি রেখে বিন্যাসটি দখল করবে।


2
আমি একই সন্ধান করছিলাম, যা যদি ওয়েটসাম সংজ্ঞায়িত না হয় এবং ওজনগুলি সন্তানের মতামতগুলিতে সরবরাহ করা হয় তবে। আপনার উত্তরটি যে এটি নিজের মুছে ফেলা সমস্ত কিছুর নিজস্ব হিসাবে গণনা করে
ডেল্টাপ্যাপ 01

এটি কি সত্য যে ওজনসাম সহ লেআউটগুলির তুলনায় রিলেটিভলআউট ব্যবহার করার পরামর্শ দেওয়া হয়?
রবার্ট

26

ওজন যোগফল যেমন আপনি চান ঠিক তেমন কাজ করে (অন্যান্য উত্তরগুলির মতো আপনাকে প্যারেন্ট লেআউটে সমস্ত ওজনের যোগফল দিতে হবে না)। শিশু দর্শনে আপনি যে ওজন নিতে চান তা উল্লেখ করুন। নির্দিষ্ট করতে ভুলবেন না

android:layout_width="0dp" 

নিম্নলিখিত একটি উদাহরণ

    <LinearLayout
                android:layout_width="500dp"
                android:layout_height="20dp" >

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="3"
                    android:background="@android:color/holo_green_light"
                    android:gravity="center"
                    android:text="30%"
                    android:textColor="@android:color/white" >
                </TextView>

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="2"
                    android:background="@android:color/holo_blue_bright"
                    android:gravity="center"
                    android:text="20%"
                    android:textColor="@android:color/white" >
                </TextView>

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="5"
                    android:background="@android:color/holo_orange_dark"
                    android:gravity="center"
                    android:text="50%"
                    android:textColor="@android:color/white" >
                </TextView>
 </LinearLayout>

এই মত দেখতে হবে

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


25

ডকুমেন্টেশন এটা ভাল বলেছেন এবং একটি উদাহরণ, (খনি হাইলাইট) অন্তর্ভুক্ত করা হয়েছে।

অ্যান্ড্রয়েড weightSum

সর্বাধিক ওজনের যোগফল নির্ধারণ করে। যদি অনির্ধারিত থাকে, তবে সমস্ত শিশুর লেআউট_ ওয়েট যোগ করে যোগফল গণনা করা হয়। উদাহরণস্বরূপ এটি একক শিশুকে মোট উপলব্ধ স্থানের ৫০% দেওয়ার জন্য এটি একটি লেআউট_ ওয়েট 0.5 প্রদান করে এবং ওজনসামকে 1.0 এ সেট করে ব্যবহার করা যেতে পারে।

সুতরাং সুপারমের উদাহরণটি সংশোধন করার জন্য, ধরুন আপনার কাছে LinearLayoutঅনুভূমিক প্রবণতা রয়েছে যার সাথে দুটি ImageViewsএবং একটি TextViewরয়েছে। আপনি TextViewএকটি নির্দিষ্ট আকারের জন্য সংজ্ঞা দিন এবং আপনি দুজনেই ImageViewsবাকি স্থানটি সমানভাবে গ্রহণ করতে চান।

এটি সম্পাদন করার জন্য, আপনি layout_weightপ্রতিটিতে 1 টি প্রয়োগ করবেন ImageView, এর উপর কোনওটি নয় TextView, এবং weightSumএর উপর 2.0 এর একটি LinearLayout


20

কিছু পরীক্ষা-নিরীক্ষার পরে, আমি মনে করি লিনিয়ারলআউটটির জন্য অ্যালগরিদম এটি:

ধরুন যে weightSumএটি একটি মান সেট করা আছে। অনুপস্থিতির বিষয়টি পরে আলোচনা করা হয়।

প্রথমত, বিভক্ত weightSumসাথে থাক উপাদানের সংখ্যা দ্বারা match_parentবা fill_parentLinearLayout মাত্রা (যেমন layout_widthজন্য orientation="horizontal")। আমরা w_mপ্রতিটি মানের জন্য এই মানটিকে ওজন গুণক বলব। এর জন্য ডিফল্ট মান weightSum1.0, সুতরাং ডিফল্ট ওজন গুণক 1/n, যেখানে উপাদানের nসংখ্যা fill_parent; wrap_contentউপাদানগুলি অবদান রাখে না n

ডাব্লু_ম = ওয়েটসাম / # সম্পূর্ণ_পিতা

উদাহরণস্বরূপ, যখন weightSum60 হয় এবং 3 টি fill_parentউপাদান থাকে, ওজন গুণক 20 হয় The যেমন layout_widthগুণাবলীর অনুপস্থিত থাকলে ওজন গুণকটি ডিফল্ট মান ।

দ্বিতীয়ত, প্রতিটি উপাদানের সর্বাধিক সম্ভাব্য সম্প্রসারণ গণনা করা হয়। প্রথমত, wrap_contentউপাদানগুলি তাদের বিষয়বস্তু অনুসারে গণনা করা হয়। তাদের প্রসারণ পিতামাতার ধারক প্রসারণ থেকে কেটে নেওয়া হয়। আমরা রক্ষককে কল করব expansion_remainer। এই অবশিষ্টাংশগুলি fill_parentতাদের অনুসারে উপাদানগুলির মধ্যে বিতরণ করা হয় layout_weight

তৃতীয়ত, প্রতিটি fill_parentউপাদানটির বিস্তৃতি হিসাবে গণনা করা হয়:

ডাব্লু_এম - (লেআউট_ওয়েট / ডাব্লু_ম) * সর্বাধিক_ সম্ভাব্য_পরিচয়টি

উদাহরণ:

যদি weightSum60 হয় এবং fill_parent10, 20 এবং 30 এর ওজন সহ 3 টি উপাদান থাকে তবে পর্দায় তাদের সম্প্রসারণ পিতামাতার ধারকটির 2/3, 1/3 এবং 0/3 হয়।

weight | expansion
     0 | 3/3
    10 | 2/3
    20 | 1/3
    30 | 0/3
    40 | 0/3

সর্বনিম্ন প্রসারণ 0 এ ক্যাপড হয় সর্বাধিক প্রসারণ প্যারেন্ট আকারে ক্যাপড হয়, অর্থাৎ ওজন 0-এ ধারণ করা হয়।

যদি কোনও উপাদান সেট করা থাকে তবে wrap_contentপ্রথমে এর বিস্তৃতি গণনা করা হবে এবং অবশিষ্ট সম্প্রসারণ fill_parentউপাদানগুলির মধ্যে বিতরণের সাপেক্ষে । যদি weightSumসেট করা থাকে তবে layout_weightএটি wrap_contentউপাদানগুলিতে কোনও প্রভাব ফেলবে না । যাইহোক, wrap_contentউপাদানগুলির দৃশ্যমান ক্ষেত্রের বাইরে থাকা উপাদানগুলিকে এখনও ওজনগুলি ঠেলে দেওয়া যেতে পারে যাদের ওজন কম ওজন গুণক(উদাহরণস্বরূপ weightSum= 1 এর জন্য 0-1 এর মধ্যে বা উপরের উদাহরণের জন্য 0-20 এর মধ্যে)।

যদি কোনও weightSumনির্দিষ্ট না করা থাকে, এটি সেট সহ উপাদান সহ সমস্ত layout_weightমানের যোগফল হিসাবে গণনা করা হয় ! সুতরাং উপাদান উপর সেট করা , তাদের প্রসারণ প্রভাবিত করতে পারে । যেমন একটি নেতিবাচক ওজন অন্যান্য উপাদান সঙ্কুচিত করবে । উপাদানগুলি নির্ধারণের আগে , উপরের সূত্রটি কি উপাদানগুলিতে প্রয়োগ করা হবে, মোড়কযুক্ত সামগ্রী অনুযায়ী সর্বাধিক সম্ভাব্য সম্প্রসারণটি তাদের সম্প্রসারণ হবে? উপাদান সঙ্কুচিত হবে, এবং পরে অবশিষ্ট জন্য সর্বোচ্চ সম্ভব সম্প্রসারণ উপাদান নির্ণিত এবং বিতরণ করা হয়।wrap_contentlayout_weightwrap_contentfill_parentfill_parentwrap_contentwrap_contentfill_parent

এটি অনিয়মিত ফলাফল হতে পারে।


10

যদি নির্ধারিত না হয় তবে সমস্ত বাচ্চার লেআউট_ ওয়েট যোগ করে যোগফল গণনা করা হয়। উদাহরণস্বরূপ এটি একক শিশুকে মোট উপলব্ধ স্থানের ৫০% দেওয়ার জন্য এটি একটি লেআউট_ ওয়েট 0.5 প্রদান করে এবং ওজনসামকে 1.0 এ সেট করে ব্যবহার করা যেতে পারে। ভাসমান পয়েন্টের মান অবশ্যই হবে, যেমন "1.2"

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_rel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:weightSum="2.0" >

        <RelativeLayout
            android:id="@+id/child_one"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="#0000FF" >
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/child_two"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1.0"
            android:background="#00FF00" >
        </RelativeLayout>

    </LinearLayout>

'ভাসমান পয়েন্টের মান হতে পারে যেমন "1.2"' ( বিকাশকারী.অ্যান্ড্রয়েড.
অবিশ্বাস্য জানুয়ারী

6

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


1
অ্যান্ড্রয়েড: লেআউট_উইথ = "ম্যাচ_প্যারেন্ট" সাধারণত 0 ডিপি
কেসি ওচিবিলে

কেন যে এত? আমি আপনাকে বোঝাতে চাইছি ঠিক যে এটি গণ্ডগোল করছে তবে উচ্চতা 0 ডিপি সেট করা আমার সমস্যাটি সমাধান করেছে। আমি কারণ জানতে চাই।
আব্দুল ওয়াহেদ

2

লেআউট ওজন অনুপাতের মতো কাজ করে। উদাহরণস্বরূপ, যদি একটি উল্লম্ব বিন্যাস থাকে এবং দুটি আইটেম থাকে (যেমন বোতাম বা পাঠ্যদর্শনগুলি), একটির লেআউটের ওজন 2 এবং অন্যটির যথাক্রমে 3 টি লেআউটের ওজন থাকে। তারপরে 1 ম আইটেমটি স্ক্রিন / লেআউটের 5 অংশের মধ্যে 2 এবং অন্য 5 টির মধ্যে 3 অংশ দখল করবে। এখানে 5 ওজনের যোগফল sum অর্থাত্ ওজন যোগফল পুরো বিন্যাসকে সংজ্ঞায়িত অংশগুলিতে ভাগ করে দেয়। এবং লেআউট ওজন নির্ধারণ করে যে নির্দিষ্ট ওজন যোগফলের পূর্ব নির্ধারিত অংশের মধ্যে নির্দিষ্ট আইটেমটি কত অংশ দখল করে। ওজন যোগফল ম্যানুয়ালি পাশাপাশি ঘোষণা করা যেতে পারে। ইউআই ডিজাইনের জন্য লিনিয়ার লেআউট ব্যবহার করার সময় বোতাম, পাঠ্যদর্শন, সম্পাদনাশক্তি ইত্যাদি সমস্ত ভারসাম এবং বিন্যাসের ওজন ব্যবহার করে সংগঠিত হয়।


1

বিকাশকারী ডকুমেন্টেশন থেকে

উদাহরণস্বরূপ 50%এটি মোট উপলব্ধ স্থানের একক শিশুকে একটি লেআউট_ ওয়েট এর একটি লেআউট_ ওয়েট প্রদান করে 0.5এবং ওজন সেটকে সেট করে এটি ব্যবহার করা যেতে পারে1.0

@ শুভায়ু উত্তর যুক্ত করুন

বিশ্রাম 3/5 অন্যান্য শিশু লেআউটগুলির জন্য ব্যবহার করা যেতে পারে যা প্রকৃতপক্ষে বিন্যাসের নির্দিষ্ট অংশের প্রয়োজন হয় না।

এটি android:weightSumসম্পত্তির সম্ভাব্য ব্যবহার ।

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