Как установить ширину кнопки динамически во время выполнения, чтобы заполнить экран?

Я изучаю разработку Android, и я пытаюсь заполнить экран шестью кнопками. Но я хочу установить размер кнопки динамически. Я получаю размер экрана, используя

final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
final int screenWidthInDp = (int) (displayMetrics.widthPixels / displayMetrics.density);

и я пытаюсь установить обработчики каждой кнопки, используя

button.setWidth(screenWidthInDp/6);

У меня есть шесть кнопок в каждой строке, и я хочу изменить размер в зависимости от экрана и шести кнопок, чтобы заполнить экран. Я делаю что-то неправильно?

Это то, что кнопка выглядит как в моей activity.xml

<button android:id="@+id/bNum10" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_below="@+id/bNum2" android:layout_torightof="@+id/bNum0" android:text="@string/sign"> <p> Это мой макет</p> <pre class="prettyprint linenums"><relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/background_dark" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".Calc">

 <textview android:id="@+id/Display" android:layout_width="fill_parent" android:layout_height="25sp" android:background="@android:color/background_light" android:gravity="right" android:text="@string/Welcome" android:textcolor="@android:color/black" android:textsize="24sp">

 </textview></relativelayout>
3 ответа

Используйте linearlayout и weight для отображения 6 кнопок с равной шириной.

<linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightsum="6">

 <button android:layout_height="wrap_content" android:padding="10dip" android:layout_weight="1">

 </button><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1">
 </button><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1">
 </button><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1">
 </button><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1">
 </button></linearlayout><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"><code></code> </button>


Использование Linear Layout будет лучшим вариантом в XML. Как это:

<linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightsum="1">

 <button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.15">

 </button></linearlayout><button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.15"><code>// Other buttons and texview in similar way. Total sum of android:layout_weight values need to be 1.</code> <p> Кажется, вам больше интересно это сделать в TableLayout и 6 кнопках и 1 TextView в каждой строке. Я бы сделал так, что вы изменили вещи в xml:</p>

 <pre class="prettyprint linenums"><tablelayout android:id="@+id/tableLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:shrinkcolumns="*" android:stretchcolumns="*">

 <tablerow android:id="@+id/tableRow1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal">

 </tablerow></tablelayout>


@vipul mittal имеет ответ, если вам не нужно устанавливать его программно. Однако, так как вы спросили "что я делаю неправильно", вы не устанавливаете ширины кнопок, используя dp - it pixels.

Итак, когда вы получаете показатели отображения, просто разделите пиксели на 6 следующим образом:

button.setWidth((int) (displayMetrics.widthPixels/6));

licensed under cc by-sa 3.0 with attribution.