düğmeleri bir android lineerout genişliğine eşit olarak dağıtmak mümkün mü


247

3 düğme içeren doğrusal bir düzen (yatay yönlendirilmiş) var. 3 düğmenin sabit bir genişliğe sahip olmasını ve doğrusal düzenin genişliği boyunca eşit olarak dağıtılmasını istiyorum.

Bunu, doğrusal düzenin yerçekimini merkeze ayarlayıp düğmelerin dolgusunu ayarlayarak yönetebilirim, ancak bu sabit bir genişlikte çalışır ve aygıtları veya yönleri değiştirmek için çalışmaz.

<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>


Yanıtlar:


339

Üzerine Genişleyen fedj cevabı ayarladığınız takdirde, layout_widthiçin 0dpve set layout_weight1'e düğmelerin her biri için, mevcut genişliği eşit düğmeleri arasında paylaşılacak.


81
Bunu genişletmek için, düğmelerin genişliğinin ekranın 1 / 3'ü olmasını istemiyorsanız, her düğmeyi bir LinearLayout'a sarın ve 3 LinearLayouts'ta layout_width = "0dp" ve layout_weight = "1" değerini ayarlayın. Ayrıca, düğmelerin her bir LinearLayout'un ortasına hizalanması için LinearLayouts üzerindeki yerçekimini "orta" olarak ayarlayın.
Andrew

Bu sadece lineerlayout için geçerlidir. herhangi biri göreceli düzende equispacing için herhangi bir fikir verebilir
user1859771

1
Benim durumumda, layout_width = "wrap_content" kullanıyorum ve sadece layout_weight = "1" ile iyi çalışıyor!
StefanoM5

OP'nin düzeltilmesini istediği için bu doğru değildir. Stoefln'in cevabına bakınız.
Mitulát báti

228

Düğmelerin ölçeklenmesini istemiyorsanız, ancak düğmeler arasındaki boşluğu ayarlayın (tüm düğmeler arasındaki eşit boşluk), düğmeler arasındaki boşluğu dolduracak ağırlık = "1" olan görünümleri kullanabilirsiniz:

    <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
Bu kesinlikle çalışan en basit, en düşük havai yöntemdir (görünümler arasındaki boşluğun, görünümlerin kendileri değil, ölçeklendirilmesini istediğiniz durumda). Dikey olarak kullanıyorum ve böylece genişlik ve yükseklik değerlerini değiştirdim. Teşekkürler.
samis

7
Bu zarif bir çözüm. SpaceGörünüm türünü kullanmayı tercih edebilirsiniz . İşleri biraz daha okunabilir hale getirir.
Ryan R

2
Ryan, evet, API 14+ kullanıyorsanız (olması gerektiği gibi).
Eduardo Naveda

Dürüst olmak gerekirse, 4 düğme olduğunda işe yaramayacağını düşündüm, ancak hiçbir yaygara ve çalışma zamanı ölçümü olmadan mükemmel çalıştı. Saygı!
Ashraf Alshahawy

Bu, şu anda cevap olarak kabul edilenden daha iyidir.
DroidHeaven

25

Aşağıdaki gibi kullanabilirsiniz.

<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>

Bu sweeet !! Şimdiye Spacekadar hiç duymadım
Birisi

21

Her iki vererek bunu yapabilirsiniz Viewsa layout_widtharasında 0dpve layout_weightiçinde 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>

Android layout_weight'ün çalışması şu şekildedir:

  • ilk olarak, bir Görünümün normal olarak alacağı boyuta bakar ve bu alanı ayırır.
  • ikincisi, eğer düzen ise , kalan alanı s oranında match_parentböler . Eğer Görüşler verdiyseniz ve elde edilen oran 2 ila 1 olacaksa, yani: İlk Görüş kalan alanın 2 / 3'ünü ve diğer görünüm 1/3'ü alır.layout_weightlayout_weight="2"layout_weight="1"

Bu nedenle , ilk adımın layout_widthbir boyutunu verirseniz 0dp, her iki Görünüm'e de boşluk atanmadığından başka bir anlamı yoktur. Daha sonra sadece ikinci nokta her birinin Viewaldığı alana karar verir , böylece Views'ye orana göre belirttiğiniz alanı verir!

Bunun 0dptersini gösteren bir örnek sağlayarak alanın neden eşit şekilde ayrılmasına neden olduğunu açıklamak için: Aşağıdaki kod farklı bir şeyle sonuçlanacaktır, çünkü bunun yerine boş alanı% 100'den daha az bölmeye bıraktığı için example textdaha büyük bir genişliğe 0dpsahiptir. wrap_contentçünkü metin yer kaplıyor. Sonuç olarak, boş alanın% 50'sini bırakacaklar, ancak metin zaten biraz yer kapladı, böylece toplam alanın % 50'sinden fazlasınaTextView sahip olacak .

<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

Tam olarak 3 düğmeniz varsa ve dış düğmelerin sol ve sağ tarafa hizalanması tamamsa (veya planlanmışsa), daha az ek yük olan (birçok durumda) bir RelativeLayout'u denemek isteyebilirsiniz.

layout_alignParentBottomTüm düğmeleri mizanpajın alt kısmıyla hizalamak için kullanabilirsiniz . layout_alignParentLeft and RightDış düğmeler ve layout_centerHorizontalorta düğme için kullanın .

Bu, farklı yönlerde ve ekran boyutlarında iyi çalışır.


Açıklığa kavuşturmak için üçten fazla düğmeniz varsa bu işe yaramaz.
arlomedia

Kesinlikle. Bunun yerine bir LinearLayout veya RadioGroup (varsa) kullanmanız gerekir.
marsbear

11

Android'e bir göz atmalısınız: layout_weight attribute


1
Layout_weight özniteliğinin düzeni doldurmak için düğmenin boyutunu uzatacağını anladım. Düğmelerin boyutunu sabit tutmak ve düğmeler arasındaki dolguyu artırmak istiyorum.
yamspog

Ah! Bunu yapmanın en iyi yolunu gerçekten bilmiyorum. Belki de her düğmeyi düzende içine almak. Layout_weight özniteliğine sahip 3 düzen ve düzende ortalanmış düğme. Ama bunu yapmanın en iyi yolu olup olmadığını gerçekten bilmiyorum.
fedj

9

Bunun için modern çözüm Flexbox .

<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>

İçe aktardığınızdan emin olun implementation 'com.google.android:flexbox:2.0.0'

Flexboxçok daha güçlü; için iyi bir tamamlayıcıdır ConstraintLayout. Bu daha fazla bilgi edinmek için harika bir kaynak .

Space_around, space_between ve space_evenly arasındaki fark


1
beni haberdar ettiğin için teşekkürler. Kesinlikle faydalı. "Space_around" kullandım ve FlexBox içinde 1 veya 3 görünür olduğunda düğmeler güzel ortalanmış
Birisi

4

Yatay doğrusal bir düzende iki düğmeyi eşit aralıklarla ayırmak için, otomatik olarak yeniden boyutlandırılacak boşluklar olarak hareket etmek üzere 3 LinearLayout nesnesi kullandım. Bu LinearLayout nesnelerini aşağıdaki gibi konumlandırdım:

[] Düğme1 [] Düğme2 []

([] boşluk bırakmak için kullanılan bir LinearLayout nesnesini temsil eder)

sonra bu [] LinearLayout nesnelerinin ağırlıklarının her birini 1 olarak ayarladım ve eşit aralıklarla yerleştirilmiş düğmeler alıyorum.

Bu yardımcı olur umarım.



4

LinearLayout'un weightSum özelliğini kullanmanızı öneririm.

Etiketi android:weightSum="3"LinearLayout öğenizin xml bildirimine ve ardından android:layout_weight="1"Düğmelerinize eklemek, 3 düğmenin eşit olarak dağıtılmasına neden olur.


4

Bu, weightyatay yönlendirmeyi tanımlamak için çok önemli olan, kabın içine eklenen her düğmeye atanarak gerçekleştirilebilir :

    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);
    }

böylece bunu cihazımızda elde edebiliriz:

resim açıklamasını buraya girin

weightcihazımızı döndürsek bile , her bir düğmede tanımlanan elemanlar kap içinde üniform bir şekilde dağıtılabilir:

resim açıklamasını buraya girin


3

En iyi yaklaşım TableLayout'u android ile kullanmaktır: layout_width = "match_parent" ve sütunlarda tüm sütunlar için android: layout_weight = "1" kullanın


2

Layout_did kullanarak yukarıdaki cevaplar benim için çalışmıyor, ancak aşağıdakiler işe yaradı.

<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>

Ekranda böyle görünüyor,

resim açıklamasını buraya girin


2

Her şeyden önce cevaplar doğru ama görünür ve gitmiş özelliklere ihtiyacınız varsa, bu pragmatik olarak yöntem iyi çalışır

<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

Eşit ağırlıklı çocuklar

Her çocuğun ekranda aynı miktarda alan kullandığı doğrusal bir düzen oluşturmak için her görünümün android: layout_height değerini "0dp" (dikey bir düzen için) veya android: layout_width değerini "0dp" ( yatay düzen için). Ardından her görünümün android: layout_weight değerini "1" olarak ayarlayın.

İş bu için için LinearLayoutgörünüm grubuna özelliğinizin değerleri android:layout_widthve android:layout_heightihtiyaç eşit olacak şekilde "match_parent"...


Bir ton dostum teşekkürler! Çok zaman kazandım.
Xonshiz

1
Sorun yok, arkadaşım.
Gibran Castillo

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>

Daire içinde Tom, Tim ve Todd'un 3 santimetre olduğu varsayılır. Dokunmatik ekran olmasını istiyorsanız, Tom ve Tim'in 1 santimetre olduğu varsayılır, yani sanal olanı birleştirir, ancak 2D düzlemi alttadır. Bu ekranda görüntülenir.


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

En kolay ve en hızlı yol (ama en iyisi değil), boş metin özniteliğine sahip bir TextView eklemektir.

android:text=""

arka plan rengi LinearLayout'ta aynı olmalıdır, o zaman dolgu özelliğini kullanabilirsiniz, bunun gibi

android:paddingBottom="250dp"

veya neye ihtiyacınız varsa. İşte bir örnek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.