আমি জানতে চাই: অ্যান্ড্রয়েড কী: ওয়েটসাম এবং বিন্যাসের ওজন, এবং তারা কীভাবে কাজ করে?
আমি জানতে চাই: অ্যান্ড্রয়েড কী: ওয়েটসাম এবং বিন্যাসের ওজন, এবং তারা কীভাবে কাজ করে?
উত্তর:
প্রতি ডকুমেন্টেশন, android:weightSum
সর্বাধিক ওজনের যোগফলকে সংজ্ঞায়িত করে এবং layout_weight
স্পষ্টভাবে নির্দিষ্ট না করে সমস্ত শিশুদের যোগফলের সমষ্টি হিসাবে গণনা করা হয় ।
আসুন LinearLayout
ওরিয়েন্টেশন এবং এর ImageViews
ভিতরে 3 সহ একটি উদাহরণ বিবেচনা করি। এখন আমরা এগুলি ImageViews
সর্বদা সমান স্থান গ্রহণ করতে চাই । এটির জন্য, আপনি layout_weight
প্রতিটিতে ImageView
1 টি সেট করতে পারেন এবং 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
কোনও ডিভাইসের জন্য লেআউটটি সঠিকভাবে রেন্ডার করার জন্য দরকারী, আপনি যদি প্রস্থ এবং উচ্চতাটি সরাসরি সেট করেন তবে তা ঘটবে না।
সুপারএম এবং জেফের উত্তরে যুক্ত করা,
লিনিয়ারলআউটে যদি 2 টি ভিউ থাকে তবে প্রথমে 1 এর লেআউট_ ওয়েট সহ দ্বিতীয়টি 2 এর লেআউট_ ওয়েট সহ 2 টি এবং কোনও ওজনসাম নির্দিষ্ট করা হয় না, ডিফল্টরূপে ওয়েটসাম 3 (বাচ্চাদের ওজনের যোগফল) হিসাবে গণনা করা হয় এবং প্রথম দৃশ্যটি স্থানটির 1/3 অংশ নেয় যখন দ্বিতীয়টি 2/3 নেয়।
তবে, যদি আমরা ওয়েটসাম 5 হিসাবে নির্দিষ্ট করে রাখি তবে প্রথম স্থানটির 1/5 তম স্থান গ্রহণ করবে এবং দ্বিতীয়টি 2/5 তম স্থান নেবে। সুতরাং মোট 3/5 স্পেস বাকি খালি রেখে বিন্যাসটি দখল করবে।
ওজন যোগফল যেমন আপনি চান ঠিক তেমন কাজ করে (অন্যান্য উত্তরগুলির মতো আপনাকে প্যারেন্ট লেআউটে সমস্ত ওজনের যোগফল দিতে হবে না)। শিশু দর্শনে আপনি যে ওজন নিতে চান তা উল্লেখ করুন। নির্দিষ্ট করতে ভুলবেন না
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>
এই মত দেখতে হবে
ডকুমেন্টেশন এটা ভাল বলেছেন এবং একটি উদাহরণ, (খনি হাইলাইট) অন্তর্ভুক্ত করা হয়েছে।
অ্যান্ড্রয়েড weightSum
সর্বাধিক ওজনের যোগফল নির্ধারণ করে। যদি অনির্ধারিত থাকে, তবে সমস্ত শিশুর লেআউট_ ওয়েট যোগ করে যোগফল গণনা করা হয়। উদাহরণস্বরূপ এটি একক শিশুকে মোট উপলব্ধ স্থানের ৫০% দেওয়ার জন্য এটি একটি লেআউট_ ওয়েট 0.5 প্রদান করে এবং ওজনসামকে 1.0 এ সেট করে ব্যবহার করা যেতে পারে।
সুতরাং সুপারমের উদাহরণটি সংশোধন করার জন্য, ধরুন আপনার কাছে LinearLayout
অনুভূমিক প্রবণতা রয়েছে যার সাথে দুটি ImageViews
এবং একটি TextView
রয়েছে। আপনি TextView
একটি নির্দিষ্ট আকারের জন্য সংজ্ঞা দিন এবং আপনি দুজনেই ImageViews
বাকি স্থানটি সমানভাবে গ্রহণ করতে চান।
এটি সম্পাদন করার জন্য, আপনি layout_weight
প্রতিটিতে 1 টি প্রয়োগ করবেন ImageView
, এর উপর কোনওটি নয় TextView
, এবং weightSum
এর উপর 2.0 এর একটি LinearLayout
।
কিছু পরীক্ষা-নিরীক্ষার পরে, আমি মনে করি লিনিয়ারলআউটটির জন্য অ্যালগরিদম এটি:
ধরুন যে weightSum
এটি একটি মান সেট করা আছে। অনুপস্থিতির বিষয়টি পরে আলোচনা করা হয়।
প্রথমত, বিভক্ত weightSum
সাথে থাক উপাদানের সংখ্যা দ্বারা match_parent
বা fill_parent
LinearLayout মাত্রা (যেমন layout_width
জন্য orientation="horizontal"
)। আমরা প্রতিটি মানের জন্য এই মানটিকে ওজন গুণক বলব। এর জন্য ডিফল্ট মান weightSum
1.0, সুতরাং ডিফল্ট ওজন গুণক 1/n
, যেখানে উপাদানের n
সংখ্যা fill_parent
; wrap_content
উপাদানগুলি অবদান রাখে না n
।
উদাহরণস্বরূপ, যখন weightSum
60 হয় এবং 3 টি fill_parent
উপাদান থাকে, ওজন গুণক 20 হয় The যেমন layout_width
গুণাবলীর অনুপস্থিত থাকলে ওজন গুণকটি ডিফল্ট মান ।
দ্বিতীয়ত, প্রতিটি উপাদানের সর্বাধিক সম্ভাব্য সম্প্রসারণ গণনা করা হয়। প্রথমত, wrap_content
উপাদানগুলি তাদের বিষয়বস্তু অনুসারে গণনা করা হয়। তাদের প্রসারণ পিতামাতার ধারক প্রসারণ থেকে কেটে নেওয়া হয়। আমরা রক্ষককে কল করব expansion_remainer
। এই অবশিষ্টাংশগুলি fill_parent
তাদের অনুসারে উপাদানগুলির মধ্যে বিতরণ করা হয় layout_weight
।
তৃতীয়ত, প্রতিটি fill_parent
উপাদানটির বিস্তৃতি হিসাবে গণনা করা হয়:
উদাহরণ:
যদি weightSum
60 হয় এবং fill_parent
10, 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_content
layout_weight
wrap_content
fill_parent
fill_parent
wrap_content
wrap_content
fill_parent
এটি অনিয়মিত ফলাফল হতে পারে।
যদি নির্ধারিত না হয় তবে সমস্ত বাচ্চার লেআউট_ ওয়েট যোগ করে যোগফল গণনা করা হয়। উদাহরণস্বরূপ এটি একক শিশুকে মোট উপলব্ধ স্থানের ৫০% দেওয়ার জন্য এটি একটি লেআউট_ ওয়েট 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>
একটি জিনিস যা অন্য কারও মতো উল্লেখ করা হয়নি বলে মনে হয়: আসুন আমরা বলি যে আপনার উল্লম্ব রয়েছে LinearLayout
, সুতরাং লেআউট / উপাদান / ওজনের ভারগুলির জন্য সঠিকভাবে 100% কাজ করার জন্য - তাদের সকলের অবশ্যই layout_height
সম্পত্তি থাকতে হবে (যা অবশ্যই আপনার এক্সএমএলে বিদ্যমান থাকতে হবে) ফাইল) সেট করা 0dp
। অন্য কোনও মানের মতো মনে হচ্ছে কিছু ক্ষেত্রে গণ্ডগোল হবে।
লেআউট ওজন অনুপাতের মতো কাজ করে। উদাহরণস্বরূপ, যদি একটি উল্লম্ব বিন্যাস থাকে এবং দুটি আইটেম থাকে (যেমন বোতাম বা পাঠ্যদর্শনগুলি), একটির লেআউটের ওজন 2 এবং অন্যটির যথাক্রমে 3 টি লেআউটের ওজন থাকে। তারপরে 1 ম আইটেমটি স্ক্রিন / লেআউটের 5 অংশের মধ্যে 2 এবং অন্য 5 টির মধ্যে 3 অংশ দখল করবে। এখানে 5 ওজনের যোগফল sum অর্থাত্ ওজন যোগফল পুরো বিন্যাসকে সংজ্ঞায়িত অংশগুলিতে ভাগ করে দেয়। এবং লেআউট ওজন নির্ধারণ করে যে নির্দিষ্ট ওজন যোগফলের পূর্ব নির্ধারিত অংশের মধ্যে নির্দিষ্ট আইটেমটি কত অংশ দখল করে। ওজন যোগফল ম্যানুয়ালি পাশাপাশি ঘোষণা করা যেতে পারে। ইউআই ডিজাইনের জন্য লিনিয়ার লেআউট ব্যবহার করার সময় বোতাম, পাঠ্যদর্শন, সম্পাদনাশক্তি ইত্যাদি সমস্ত ভারসাম এবং বিন্যাসের ওজন ব্যবহার করে সংগঠিত হয়।
বিকাশকারী ডকুমেন্টেশন থেকে
উদাহরণস্বরূপ 50%
এটি মোট উপলব্ধ স্থানের একক শিশুকে একটি লেআউট_ ওয়েট এর একটি লেআউট_ ওয়েট প্রদান করে 0.5
এবং ওজন সেটকে সেট করে এটি ব্যবহার করা যেতে পারে1.0
।
@ শুভায়ু উত্তর যুক্ত করুন
বিশ্রাম 3/5
অন্যান্য শিশু লেআউটগুলির জন্য ব্যবহার করা যেতে পারে যা প্রকৃতপক্ষে বিন্যাসের নির্দিষ্ট অংশের প্রয়োজন হয় না।
এটি android:weightSum
সম্পত্তির সম্ভাব্য ব্যবহার ।
weightSum
। আপনার উদাহরণের আচরণটিweightSum
বাদ দেওয়াগুলির সাথে অভিন্ন হবে এবং আসলে ওজনসামটিকে সেই দৃশ্যে নির্দিষ্ট করা উচিত নয়। ডকুমেন্টেশন বলছেন,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.