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

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

默认按钮宽度包装内容:

在所有按钮上将layout_weight设置为1并将layout_width设置为0dip会使它们均匀拉伸以填充整个屏幕宽度。 对于我想要的,这些按钮太大了,特别是在大屏幕上。

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

在父LinearLayout中为weightSum设置不同的值可以用来阻止按钮填满整个屏幕,但我不认为这是我想要的路径,因为我不希望按钮占据很大一部分在大屏幕设备上的屏幕。 为了澄清,使用weightSum,我可以,例如,设置三个按钮共同占据屏幕宽度的一半,这在小屏幕上看起来可以正常,但在大屏幕上,按钮仍然占据屏幕宽度的一半,并且按钮只会比我想要的大得多。 也许最终的解决方案是为不同的屏幕设置不同的布局文件,但我不想走这条路。

重量和5小屏幕:

重量和5大屏幕:

我也尝试过使用TableLayout的很多东西,但没有比使用LinearLayout更好的东西。

GridView使用起来非常笨拙,我还没有尝试过。

那么,如何创建具有相同宽度的按钮,最好只需要宽度足以使按钮的内容与最长的标签相匹配?

任何建议表示赞赏。

(我确实搜索过并发现这个问题并且多次回答,但我find的答案都没有解决我想要实现的问题。)

也许最终的解决方案是为不同的屏幕设置不同的布局文件,但我不想走这条路。

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

那么,如何创建具有相同宽度的按钮,最好只需要宽度足以使按钮的内容与最长的标签相匹配?

要完成“首选”[原文如此]的要求,您需要为此创建自定义布局类。 对于仪表板模式,可以使用以下内容作为起点。

如果您事先知道最宽的按钮文本是什么,则可以使用android:ems属性将按钮设置为该宽度。

它并不完美,但它是我发现实现这种外观的最简单方式,而不会无休止地摆弄布局。

来自我身边的另外一张纸条!

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

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 - 包含另一个布局的布局,包含我们需要对齐的内容( v.getChildAt(0); )和其他v.getChildAt(1); )。

LinearLayout v =(LinearLayout)llModules.getChildAt(i); - 获取要对齐的按钮布局。

其他部分很清楚。

这段代码中的两个循环完全相同,但我仍然无法想象如何组合它们(以加快执行时间)。

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

阅读这个post,然后做一些试错,并注意到android:layout_width="180px"是一个可接受的参数。 现在如上所述,我只是偶然发现了这一点,没有尝试使用它来解决你的三个按钮场景。

你最初发布的内容可能会发生变化。 虽然我在为1.5版本构建时尝试了这个。 那已经足够了…… 🙂

这是完整的main.xml :