অ্যানড্রয়েড লিনিয়ারলআউটের প্রস্থ জুড়ে সমানভাবে বোতাম বিতরণ করা কি সম্ভব?


247

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

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

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:gravity="center">

<Button 
android:id="@+id/btnOne"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

<Button 
android:id="@+id/btnTwo"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>


<Button 
android:id="@+id/btnThree"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

</LinearLayout>

প্রতিলিপি? stackoverflow.com/questions/3450561/...

উত্তর:


339

উপর সম্প্রসারিত fedj এর উত্তর , যদি আপনি নির্ধারণ layout_widthকরতে 0dpএবং সেট layout_weight1 থেকে বোতাম প্রত্যেকের জন্য, উপলব্ধ প্রস্থ সমান বোতাম মধ্যে ভাগ করা হবে।


81
এটি প্রসারিত করতে, আপনি যদি বোতামগুলির প্রস্থের স্ক্রিনের 1/3 তম হতে চান না, তবে প্রতিটি বোতামটি একটি লিনিয়ারলাউটগুলিতে মোড়ানো এবং 3 লিনিয়ারলাউটগুলিতে লেআউট_উইথ = "0 ডিপি" এবং লেআউট_ ওয়েট = "1" সেট করুন। অতিরিক্তভাবে, লিনিয়ারলআউটগুলিতে মাধ্যাকর্ষণটিকে "কেন্দ্রে" সেট করুন যাতে বোতামগুলি প্রতিটি লিনিয়ারলআউটের কেন্দ্রে প্রান্তিক হয়।
অ্যান্ড্রু

এটি কেবল লিনিয়ারআলআউটের ক্ষেত্রেই রয়েছে relative আপেক্ষিক লেআউটে সাম্যসুখের জন্য যে কেউ কোনও ধারণা দিতে পারে
ব্যবহারকারী 1859771

1
আমার ক্ষেত্রে, আমি লেআউট_উইথ = "র‌্যাপ_কন্টেন্ট" ব্যবহার করি এবং কেবলমাত্র লেআউট_ ওয়েট = "1" দিয়ে ভাল কাজ করে!
স্টিফানোএম 5

ওপি যেমন স্থির করতে চায় তেমনটি সঠিক নয়। স্টোফ্লেনের উত্তর দেখুন।
মিতুলাট বিটি

228

আপনি যদি বাটনগুলি স্কেল করতে না চান তবে বোতামগুলির মধ্যে ব্যবধানকে সামঞ্জস্য করতে (সমস্ত বোতামের মধ্যে সমান ব্যবধান), আপনি ওজন = "1" দিয়ে দর্শনগুলি ব্যবহার করতে পারেন যা বোতামগুলির মধ্যে স্থান পূরণ করবে:

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/tars_active" />

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/videos_active" />

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>

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

7
এটি একটি মার্জিত সমাধান। আপনি Spaceভিউ টাইপ ব্যবহার করতে পছন্দ করতে পারেন । জিনিসগুলিকে কিছুটা বেশি পঠনযোগ্য করে তোলে।
রায়ান আর

2
রায়ান, হ্যাঁ, আপনি যদি API 14+ ব্যবহার করেন (যেমন আমাদের উচিত)।
এডুয়ার্ডো নাভেদা

সত্যিই, আমি ভেবেছিলাম 4 টি বোতাম রাখার সময় এটি কাজ করবে না, তবে কোনও গোলমাল এবং রানটাইম পরিমাপ না করে এটি দুর্দান্তভাবে কাজ করেছে। সম্মান!
আশরাফ আলশাহওয়াই

বর্তমানে উত্তর হিসাবে গ্রহণযোগ্যতার চেয়ে এটি ভাল।
ড্রয়েডহ্যাভেন

25

আপনি নীচের মত এটি ব্যবহার করতে পারেন।

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="15dp">
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>

ওটা মিষ্টি !! আমি Spaceএখন পর্যন্ত কখনও শুনিনি
কেউ কোথাও

21

আপনি উভয় দিয়ে এটা করতে পারেন ViewSA layout_widthএর 0dpএবং layout_weightএর 1:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

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

    <TextView
        android:layout_width="0dp"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>

অ্যান্ড্রয়েড লেআউট_ ওয়েট যেভাবে কাজ করে তা হ'ল:

  • প্রথমত, এটি এমন আকারের দিকে নজর দেয় যে কোনও ভিউ সাধারণত এই স্থানটি গ্রহণ করে এবং সংরক্ষণ করে।
  • দ্বিতীয়ত, যদি বিন্যাসটি হয় match_parentতবে এটি s এর অনুপাতে থাকা স্থানটিকে বিভক্ত করবে layout_weight। সুতরাং আপনি যদি ভিউ দিয়েছেন layout_weight="2"এবং layout_weight="1", ফলস্বর অনুপাতটি 2 থেকে 1 হবে, যা: প্রথম দৃশ্যটি অবশিষ্ট স্থানের 2/3 এবং অন্য দর্শনটি 1/3 পাবে।

এই কারণেই যদি আপনি প্রথম ধাপের layout_widthআকার 0dpদেন তবে উভয় দর্শন কোনও স্থান বরাদ্দ না করায় কোনও যুক্ত অর্থ হয় না। তারপরে কেবল দ্বিতীয় পয়েন্টটি প্রতিটি প্রাপ্ত স্থানটি স্থির করে View, এভাবে প্রদান করেView অনুপাত অনুসারে আপনার নির্দিষ্ট করা স্থানটিকে দেওয়া!

কেন 0dpস্থানটি সমানভাবে বিভক্ত হয়ে একটি উদাহরণ সরবরাহ করে যা বিপরীত দেখায় তার কারণ ব্যাখ্যা করার জন্য: নীচের কোডটির ফলে example textএখন কিছু আলাদা হবে যেটির প্রস্থটি এর চেয়ে বেশি হবে 0dpকারণ এটি wrap_contentফাঁকা স্থানটি 100% এর চেয়ে কম ভাগ করার জন্য তৈরি করেছে below কারণ পাঠ্যটি স্থান নেয়। ফলাফলটি হ'ল তারা খালি 50% বাকী স্থান পাবে তবে পাঠ্যটি ইতিমধ্যে কিছু জায়গা নিয়েছে যাতে মোট জায়গার 50% এরও বেশি ভালTextView থাকবে ।

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

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

    <TextView
        android:layout_width="wrap_content"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>

13

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

layout_alignParentBottomবিন্যাসের নীচে সমস্ত বোতাম সারিবদ্ধ করতে আপনি ব্যবহার করতে পারেন । layout_alignParentLeft and Rightবাইরের বোতামগুলির জন্য এবং ব্যবহার করুনlayout_centerHorizontal মধ্যম বাটন জন্য।

এটি বিভিন্ন ওরিয়েন্টেশন এবং স্ক্রিন আকারে ভালভাবে কাজ করবে।


পরিষ্কার করার জন্য, আপনার কাছে তিনটির বেশি বোতাম থাকলে এটি কাজ করে না।
আরলোমেডিয়া

যথাযথভাবে। পরিবর্তে আপনাকে লিনিয়ারলআউট বা রেডিওগ্রুপ ব্যবহার করতে হবে (যদি প্রযোজ্য হয়)।
মার্সবিয়ার

11

আপনার অ্যান্ড্রয়েড: লেআউট_ ওয়েট অ্যাট্রিবিউটটি একবার দেখে নেওয়া উচিত


1
এটি আমার বোঝা গেল যে লেআউট_ ওয়েটের বৈশিষ্ট্যটি লেআউটটি পূরণ করতে বোতামটির আকার প্রসারিত করবে। আমি বোতামগুলির আকার স্থির রাখতে চাই এবং বোতামগুলির মধ্যে প্যাডিং বাড়িয়ে তুলতে চাই।
ইয়ামস্পগ

আহ! আমি এটি করার সর্বোত্তম উপায় জানি না। লেআউটে প্রতিটি বোতাম সম্ভবত আবদ্ধ। লেআউট_ওয়েট বৈশিষ্ট্যযুক্ত 3 টি লেআউট এবং বোতামটি বিন্যাসকে কেন্দ্র করে। তবে এটি করার সর্বোত্তম উপায় কিনা তা আমি সত্যই জানি না।
ফেডজ

9

এর আধুনিক সমাধান হ'ল ফ্লেক্সবক্স

<com.google.android.flexbox.FlexboxLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:justifyContent="space_around"> <!-- or "space_between", "space_evenly" -->

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:width="120dp" />
</com.google.android.flexbox.FlexboxLayout>

আমদানি নিশ্চিত করুন implementation 'com.google.android:flexbox:2.0.0'

Flexboxঅনেক বেশি শক্তিশালী; এটি একটি ভাল পরিপূরক ConstraintLayoutএটি আরও জানার জন্য একটি দুর্দান্ত উত্স

স্পেস_আরউন্ড, স্পেস_বেটুইন এবং স্পেস_অভেনলি মধ্যে পার্থক্য


1
আমাকে (আমাদের) সচেতন করার জন্য ধন্যবাদ অবশ্যই কার্যকর। আমি "স্পেস_আরাউন্ড" ব্যবহার করেছি এবং ফ্লেক্সবক্সের মধ্যে আমার 1 বা 3 দৃশ্যমান ছিল তখন বোতামগুলি খুব ভালভাবে কেন্দ্রিক ছিল
কোথাও কেউ

4

আনুভূমিক রৈখিক বিন্যাসে দুটি বোতাম সমানভাবে ফাঁক করার জন্য, আমি 3 লিনিয়ারালাউট অবজেক্টগুলিকে ফাঁকা স্থান হিসাবে যা স্বয়ংক্রিয়ভাবে পুনরায় আকার পরিবর্তন করতে চলেছে তা হিসাবে ব্যবহার করেছি। আমি এই লিনিয়ারলআউট অবজেক্টগুলি নিম্নলিখিত হিসাবে স্থিত করেছি:

[] বাটন 1 [] বাটন 2 []

([] ব্যবধানের জন্য ব্যবহৃত লিনিয়ারআলআউট অবজেক্টের প্রতিনিধিত্ব করে)

তারপরে আমি এই প্রতিটি [] লিনিয়ারলআউট আউটজেক্টের ওজন 1 এ সেট করেছিলাম এবং আমি সমানভাবে ব্যবধানযুক্ত বোতামগুলি পাই।

আশাকরি এটা সাহায্য করবে.



4

আমি আপনাকে লিনিয়ারলআউটের ওয়েটসাম বৈশিষ্ট্যটি ব্যবহার করার পরামর্শ দিচ্ছি।

android:weightSum="3"আপনার লিনিয়ারলআউটের এক্সএমএল ঘোষণায় ট্যাগ যুক্ত করার পরে android:layout_weight="1"এবং আপনার বোতামগুলিতে 3 টি বোতাম সমানভাবে বিতরণ করা হবে।


4

weightঅনুভূমিক প্রবর্তনকে সংজ্ঞায়িত করার জন্য এটি কনটেইনারটির ভিতরে যুক্ত প্রতিটি বোতামকে অর্পণ করা সম্ভব :

    int buttons = 5;

    RadioGroup rgp = (RadioGroup) findViewById(R.id.radio_group);

    rgp.setOrientation(LinearLayout.HORIZONTAL);

    for (int i = 1; i <= buttons; i++) {
        RadioButton rbn = new RadioButton(this);         
        rbn.setId(1 + 1000);
        rbn.setText("RadioButton" + i);
        //Adding weight
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
        rbn.setLayoutParams(params);
        rgp.addView(rbn);
    }

যাতে ফলস্বরূপ আমরা আমাদের ডিভাইসে এটি পেতে পারি:

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

এমনকি যদি আমরা আমাদের ডিভাইসটি weightপ্রতিটি বোতামে সংজ্ঞায়িতভাবে ঘুরিয়ে নাও করি তবে ধারক বরাবর ইউনিফর্মালি বিতরণ করতে পারি:

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


3

অ্যান্ড্রয়েডের সাথে টেবিল লেআউটটি ব্যবহার করা সর্বোত্তম পন্থা: লেআউট_উইথ = "ম্যাচ_পিতা" এবং কলামগুলিতে অ্যান্ড্রয়েড ব্যবহার করে: লেআউট_ ওয়েট = "1" সমস্ত কলামের জন্য


2

উপরের উত্তরগুলি লেআউট_টি ব্যবহার করে আমার পক্ষে কাজ করে না, তবে নিম্নলিখিতগুলি কাজ করে।

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_weight="0.1"
    android:layout_gravity="center_horizontal"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
       />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"
        />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

</LinearLayout>

এটি স্ক্রিনে এইভাবে দেখায়,

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


2

সর্বোপরি উত্তরগুলি ঠিক আছে তবে কোনও ক্ষেত্রে আপনার দৃশ্যমান এবং অদলবদল বৈশিষ্ট্য প্রয়োজন তবে এই ব্যবহারিক পদ্ধতিটি ভালভাবে কাজ করবে

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnOne"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>

        <Button
            android:id="@+id/btnTwo"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>


        <Button
            android:id="@+id/btnThree"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>
    </LinearLayout>



 float width=CommonUtills.getScreenWidth(activity);
            int cardWidth=(int)CommonUtills.convertDpToPixel (((width)/3),activity);

LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(width,
                        LinearLayout.LayoutParams.MATCH_PARENT);

btnOne.setLayoutParams(params);
btnTwo.setLayoutParams(params);
btnThree.setLayoutParams(params);

public class CommonUtills {
public static float getScreenWidth(Context context) {
        float width = (float) 360.0;
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        width = displayMetrics.widthPixels / displayMetrics.density;
        return width;
    }
}

2

সমান ভারী বাচ্চা

একটি লিনিয়ার লেআউট তৈরি করতে যাতে প্রতিটি শিশু স্ক্রিনে একই পরিমাণে স্থান ব্যবহার করে, প্রতিটি দৃশ্যের অ্যান্ড্রয়েড: বিন্যাস_ উচ্চতা "0 ডিপি" (উল্লম্ব বিন্যাসের জন্য) অথবা অ্যান্ড্রয়েড: বিন্যাস_প্রতিদ্বন্দ্বীর প্রস্থকে "0 ডিপি" তে সেট করুন ( অনুভূমিক বিন্যাসের জন্য)। তারপরে অ্যান্ড্রয়েড: প্রতিটি ভিউয়ের লেআউট_ ওয়েটকে "1" এ সেট করুন।

LinearLayoutভিউ গ্রুপে এটি কাজ করার জন্য বৈশিষ্ট্যের মানগুলি android:layout_widthএবং এর android:layout_heightসমান হওয়া দরকার "match_parent"...


ধন্যবাদ একটি টন সাথী! অনেক সময় বাঁচিয়েছে।
জোনশিজ

1
কোন সমস্যা সাথী।
জিবরান কাস্টিলো

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

    <TextView
        android:text="Tom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

    <TextView
        android:text="Tim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:layout_weight="3"/>

    <TextView
        android:text="Todd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

</LinearLayout>

বৃত্তাকারে, টম, টিম এবং টড 3 সেন্টিমিটার ধরে নেওয়া হয়। আপনি যদি এটি টাচ ডাউন স্ক্রিনে রাখতে চান তবে এটি টম এবং টিম হিসাবে 1 সেন্টিমিটার হিসাবে ধরে নেওয়া উচিত, যার অর্থ তারা ভার্চুয়াল একত্রিত করে তবে এর 2 ডি বিমানটি নীচে রয়েছে। এটি স্ক্রিনে প্রদর্শিত হয়।


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

<TextView
    android:text="Tom"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Tim"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Todd"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />


0

সবচেয়ে সহজ এবং দ্রুততম উপায়, (তবে সেরা নয়) হ'ল খালি পাঠ্য বৈশিষ্ট্যের সাথে একটি পাঠ্য ভিউ যুক্ত করা

android:text=""

পটভূমির রঙ অবশ্যই লিনিয়ারলআউটে একই হওয়া উচিত, তারপরে আপনি প্যাডিং সম্পত্তিটি ব্যবহার করতে পারেন

android:paddingBottom="250dp"

বা আপনার যা প্রয়োজন এখানে একটি উদাহরণ।

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