是否有可能在线性布局的宽度上均匀分布按钮

我有一个LinearLayout(水平方向),包含3个按钮。我想要3个按钮有一个固定的宽度,并均匀分布在LinearLayout的宽度。

我可以通过将LinearLayout的重力设置为居中,然后调整按钮的填充来管理这一点,但这适用于固定宽度,不适用于不同的设备或方向。

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">


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


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




<Button
android:id="@+id/btnThree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="120dp" />
</LinearLayout>
266906 次浏览

你应该看看android:layout_weight属性

fedj的回答上展开,如果将layout_width设置为0dp,并将每个按钮的layout_weight设置为1,则可用宽度将在按钮之间平均共享。

好吧,如果你正好有3个按钮,如果它是ok(甚至计划),外层按钮对齐到左边和右边,那么你可能想尝试一个相对布局,这是更少的开销(在许多情况下)。

你可以使用layout_alignParentBottom将所有按钮与布局的底部对齐。外部按钮使用layout_alignParentLeft and Right,中间按钮使用layout_centerHorizontal

这将在不同的方向和屏幕尺寸上工作得很好。

为了在水平线性布局中均匀地间隔两个按钮,我使用了3个LinearLayout对象作为将自动调整大小的空间。我将这些LinearLayout对象定位如下:

[]按钮1[]按钮2 []

([]表示用于间距的线性布局对象)

然后我将每个[]LinearLayout对象的权重设置为1,我得到了均匀间隔的按钮。

希望这能有所帮助。

如果你不想让按钮缩放,但是调整按钮之间的间距(所有按钮之间的间距相等),你可以使用weight="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>

我创建了一个自定义视图DistributeLayout来做这件事。

最好的方法是使用TableLayoutandroid:layout_width="match_parent",在列中对所有列使用android:layout_weight="1"

你可以通过给两个__abc0赋值0dplayout_width1layout_weight来实现:

<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的工作方式是:

  • 首先,它查找视图通常占用的大小,并保留这个空间。
  • 其次,如果布局是match_parent,那么它将按__abc1的比例除剩下的空间。因此,如果你给视图layout_weight="2"layout_weight="1",结果的比例将是2比1,也就是说:第一个视图将获得剩余空间的2/3,而另一个视图将获得1/3。

这就是为什么如果你给layout_width一个0dp的大小,第一步没有任何附加意义,因为两个视图都没有分配任何空间。然后只有第二个点决定每个View所获得的空间,从而根据比率给View指定的空间!

下面的代码会导致一些不同的结果,因为example text现在有一个大于0dp的宽度,因为它有wrap_content,而不是留下的自由空间,以除小于100%,因为文本占用空间。结果是,它们将获得剩余的50%的空闲空间,但文本已经占用了一些空间,因此TextView将拥有总空间的远远超过50%

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

你可以像下面这样使用它。

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

我建议你使用LinearLayout的weightSum属性。

添加标签 android:weightSum="3"到你的LinearLayout的xml声明,然后android:layout_weight="1"到你的按钮将导致3个按钮均匀分布

这可以通过将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);
}

我们可以在我们的设备中得到这个结果:

enter image description here

即使我们旋转我们的设备,每个按钮中定义的weight也可以沿容器均匀分布元素:

enter image description here

上面使用layout_的答案对我没用,但是下面的答案对我有用。

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

这是它在屏幕上的样子,

enter image description here

<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厘米,这意味着他们结合虚拟,但其2D平面在底部。这显示在屏幕上。

以上所有的答案都是正确的,但在你需要可见的和消失的功能的情况下,这种实用的方法将工作得很好

<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;
}
}
<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" />

最简单和最快的方法(但不是最好的)是添加一个空文本属性的TextView,就像这样

android:text=""

背景颜色必须在LinearLayout中相同,然后你可以使用padding属性,像这样

android:paddingBottom="250dp"

或任何你需要的东西。 这里有一个例子。 < / p >

同等权重的儿童

创建一个线性布局,其中每个子元素使用相同数量的 空间,设置每个视图的android:layout_height为 "0dp"(垂直布局)或每个视图的android:layout_width 到“0dp”(用于水平布局)。然后设置android:layout_weight

为了在LinearLayout视图组中工作,android:layout_widthandroid:layout_height的属性值需要等于"match_parent"

现代的解决方案是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>

确保导入implementation 'com.google.android:flexbox:2.0.0'

Flexbox更强大;它是ConstraintLayout的一个很好的补充。这是一个很好的资源了解更多。

Difference between space_around, space_between, and space_均匀

你可以用这个。这很容易理解: 由https://developer.android < / p >

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


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


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


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


</LinearLayout>

如果你想让3个按钮有一个固定的宽度,并均匀分布在整个布局的宽度…为什么不用constraintLayout?

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">


<Button
android:id="@+id/btnOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnTwo">
            

</Button>


<Button
android:id="@+id/btnTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnThree"
app:layout_constraintStart_toEndOf="@id/btnOne"></Button>




<Button
android:id="@+id/btnThree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/btnTwo"
app:layout_constraintEnd_toEndOf="parent">
            

</Button>


</androidx.constraintlayout.widget.ConstraintLayout>


你应该使用android:weightSum属性线性布局。给线性布局一个weightSum等于布局内的按钮数量,然后设置android:layout_weight="1"和设置按钮的宽度android:layout_width="0dp" 此外,您可以使用填充和布局边距设置布局样式
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:gravity="center"
android:weightSum="3">
    

<Button
android:id="@+id/btnOne"
android:layout_width="0dp"
android:text="1"
android:layout_height="wrap_content"
android:width="120dip"
android:layout_weight="1"
android:layout_margin="15dp"
/>
    

<Button
android:id="@+id/btnTwo"
android:text="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:width="120dip"
android:layout_weight="1"
android:layout_margin="15dp" />


<Button
android:id="@+id/btnThree"
android:text="3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:width="120dip"
android:layout_weight="1"
android:layout_margin="15dp" />


</LinearLayout>

为了动态地进行

void initiate(Context context){
LinearLayout parent = new LinearLayout(context);


parent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
parent.setWeightSum(3);
parent.setOrientation(LinearLayout.HORIZONTAL);


AppCompatButton button1 = new AppCompatButton(context);
button1.setLayoutParams(new LinearLayout.LayoutParams(0 ,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f));


AppCompatButton button2 = new AppCompatButton(context);
button2.setLayoutParams(new LinearLayout.LayoutParams(0 ,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f));


AppCompatButton button3 = new AppCompatButton(context);
button3.setLayoutParams(new LinearLayout.LayoutParams(0 ,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f));
    

parent.addView(button1);
parent.addView(button2);
parent.addView(button3);


}

linearLayout中,与其赋予Button本身权重,不如将权重设置为<Space>视图,这将不会拉伸Button

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.955">


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


<Button
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/ic_baseline_arrow_back_24" />


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


<Button
android:id="@+id/captureButton"
android:layout_width="72dp"
android:layout_height="72dp"
android:background="@drawable/ic_round_camera_24" />


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


<Button
android:id="@+id/cameraChangerBtn"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/ic_round_switch_camera_24" />


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


</androidx.constraintlayout.widget.ConstraintLayout>

当我使用4 <Space>时,我设置了android:weightSum="4"linear layout中也是这样的结果:

layout preview

宽度和be均匀分布在布局的宽度上。为什么不使用constraintLayout?

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent">


<Button android:id="@+id/btnOne" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnTwo">
</Button>


<Button android:id="@+id/btnTwo" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnThree"
app:layout_constraintStart_toEndOf="@id/btnOne"></Button> <Button
android:id="@+id/btnThree" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:width="120dip"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/btnTwo"
app:layout_constraintEnd_toEndOf="parent">
</Button>


</androidx.constraintlayout.widget.ConstraintLayout>```

另一种解决方案是将按钮嵌套在约束布局中,并以这种方式等距放置它们。确保适当地设置约束,这样按钮将在布局中均匀间隔。

即使你有一个线性布局作为根。

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<androidx.appcompat.widget.AppCompatButton
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="64dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:text="asdf"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/shareButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />


<androidx.appcompat.widget.AppCompatButton
android:id="@+id/shareButton"
android:layout_width="wrap_content"
android:layout_height="64dp"


android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:text="sdsfa"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/deleteButton"
app:layout_constraintTop_toTopOf="@+id/deleteButton" />
</androidx.constraintlayout.widget.ConstraintLayout>