如何创build等宽的button?

我想在屏幕中间显示三个button,并且三个button都是相同的宽度,尽pipe它们将具有不同长度的文本标签。

只需添加三个不同长度的文本标签button,即可生成不同宽度的button。

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center"> <Button android:id="@+id/button_1" android:layout_height="fill_parent" android:layout_width="wrap_content" android:text="ABCDEF" /> <Button android:id="@+id/button_2" android:layout_height="fill_parent" android:layout_width="wrap_content" android:text="GHI" /> <Button android:id="@+id/button_3" android:layout_height="fill_parent" android:layout_width="wrap_content" android:text="JKLM" /> </LinearLayout> 

默认button宽度包装内容:
默认按钮宽度包装内容

将layout_weight设置为1,并在所有button上将layout_width设置为0dip,使其均等拉伸以填充整个屏幕宽度。 对于我想要的,这样的button太大了,特别是在大屏幕上。

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center"> <Button android:id="@+id/button_1" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="ABCDEF" /> <Button android:id="@+id/button_2" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="GHI" /> <Button android:id="@+id/button_3" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="JKLM" /> </LinearLayout> 

布局权重1button填充屏幕宽度:
布局权重1按钮填充屏幕宽度

在父LinearLayout中为weightSum设置不同的值可以用来停止填充整个屏幕上的button,但我不认为这是我想要采取的path,因为我不希望button占据很大一部分在大屏幕设备上的屏幕。 为了说明一下,使用weightSum,例如,我可以将三个button设置为占用一半的屏幕宽度,这在小屏幕上看起来可以,但是在大屏幕上,button仍然占用一半的屏幕宽度,button会比我想要的大得多。 也许最终的解决办法是简单地为不同的屏幕提供不同的布局文件,但我宁愿不走这条道路。

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center" android:weightSum="5"> <Button android:id="@+id/button_1" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="ABCDEF" /> <Button android:id="@+id/button_2" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="GHI" /> <Button android:id="@+id/button_3" android:layout_height="fill_parent" android:layout_width="0dip" android:layout_weight="1" android:text="JKLM" /> </LinearLayout> 

重量和5个小屏幕:
重量和5个小屏幕

重量总和5大屏幕:
重量和5大屏幕

我也尝试了很多与TableLayout的东西,但没有得到比只使用LinearLayout更好的东西。

GridView是非常笨拙的使用,但我还没有尝试过。

那么,如何创build具有相同宽度的button,最好只在必要的范围内尽可能宽,以适应最长标签的button内容?

任何意见表示赞赏。

(我search并发现了这个问题,并多次回答,但是我find的答案都没有解决我试图达到的目标。)

Solutions Collecting From Web of "如何创build等宽的button?"

也许最终的解决办法是简单地为不同的屏幕提供不同的布局文件,但我宁愿不走这条道路。

许多程序员将使用res/layout/res/layout-large/来处理这种情况。 在三个button的有限情况下,您可能有其他select,但通常用户界面不是那么简单。

那么,如何创build具有相同宽度的button,最好只在必要的范围内尽可能宽,以适应最长标签的button内容?

为了完成你的“优选”[原文]要求,你需要为此创build一个自定义布局类。 这里有一个与之相关的仪表盘模式,你可以用它作为起点。

如果事先知道你最大的button文字是什么,你可以使用android:ems属性来设置你的button的宽度。

 <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minEms="5" android:text="@string/my_button" /> 

这不是完美的,但是我发现实现这种效果的最简单的方法是没有无休止地摆弄布局。

在我身边只有一个附注!

如果您需要设置在运行时添加的button(或代码的简单更改的任何其他视图)的宽度(或高度),您可以使用下面的代码(它不取决于方向):

 public void AlignButtons(){ llModules = (LinearLayout) findViewById(R.id.llModules); ViewTreeObserver viewTree = llModules.getViewTreeObserver(); viewTree.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { int childcount = llModules.getChildCount(); int maxWidth = 0; //int maxHeight = 0; String fontPath = "fonts/Isabella-Decor.ttf"; Typeface tf = Typeface.createFromAsset(getAssets(), fontPath); for (int i = 0; i < childcount; i++) { LinearLayout v = (LinearLayout)llModules.getChildAt(i); View vv = v.getChildAt(0); if (vv instanceof Button) { int width = vv.getMeasuredWidth(); maxWidth = (maxWidth > width) ? maxWidth : width; //int height = vv.getMeasuredHeight(); //maxHeight = (maxHeight > height) ? maxHeight : height; } } for (int i = 0; i < childcount; i++) { LinearLayout v = (LinearLayout)llModules.getChildAt(i); View vv = v.getChildAt(0); if (vv instanceof Button) { LayoutParams params = ((Button) vv).getLayoutParams(); params.width = maxWidth; //params.height = maxHeight; ((Button) vv).setLayoutParams(params); // Applying font ((Button) vv).setTypeface(tf); } vv = v.getChildAt(1); if (vv instanceof TextView) { // Applying font ((TextView) vv).setTypeface(tf); } } return true; } }); } 

在这里,在我的情况下:

llModule – 一些布局,包含我们需要alignment的另一个布局( v.getChildAt(0); )和其他( v.getChildAt(1); )。

LinearLayout v =(LinearLayout)llModules.getChildAt(i); – 获取alignment的button布局。

其他部分是清楚的了解。

这段代码中的两个周期是完全相同的,但我仍然无法想象如何将它们结合起来(以加快执行时间)。

使用这个正确的代码,这将帮助你。

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:weightSum="3"> <Button android:id="@+id/button1" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Get the Time" android:onClick="showNewDate" /> <Button android:id="@+id/button2" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Get the Time" android:onClick="showNewDate" /> <Button android:id="@+id/button3" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Get the Time" android:onClick="showNewDate" /> 

读这个线程,然后做一些试验和错误,并注意到android:layout_width="180px"是一个可接受的参数。 现在说,我只是偶然发现,并没有试图用这个来解决你的三个button的情况。

自从你最初发布以来,情况可能会发生改变。 虽然我在为1.5版本构build时尝试了这一点。 这已经够老了:-)

这里是完整的main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/dateText" android:text="\n\nClick for Date\n\n" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button" android:layout_width="180px" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Get the Time" android:onClick="showNewDate" /> </LinearLayout>