я начал делать пример и нашел новый для меня
лаяут
вобщем я сделал небольшой примерчик, только просьба - сделать не бездумно, а прочитать внимательно и попытаться понять что там происходит
1. первое что надо сделать это подключить новый лаяут в файле build.gradle
XML |
1
| compile 'com.android.support:gridlayout-v7:23.1.1' |
|
2. пеперь разметка активити, кажется что текста много, но на самом деле там главное на что надо смотреть - это GridLayout с id="field". Это типа поле для кнопок. Остальной обвес из лаяутов потом можно выкинуть, но в примере они нужны для показа кнопок типа Старт и текстовых полей.
Если надо будет делать свою разметку от можно просто скопировать GridLayout и все.
Кликните здесь для просмотра всего текста
XML |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Счет:" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="Время 00:00" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.v7.widget.GridLayout
android:id="@+id/field"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</FrameLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="START" />
</LinearLayout> |
|
инфа для low-lvl троллей: да, я знаю что можно было сделать лаяуты по-другому и не обязательно делать все на linear, но вот мне так захотелось
3. активити
добавляем в импорты
Java |
1
| import android.support.v7.widget.GridLayout; |
|
где-то в onCreate() мы находим наш лаяут с id ="field" и вызываем метод в котором происходит магия
Java |
1
2
| GridLayout field = (GridLayout) findViewById(R.id.field);
createButtons(10, 10, field); |
|
и сам метод + слушатель, просто копируем куда-то в активити, можно почитать комментарии, но в алгоритм можно не вникать на начальном этапе
Кликните здесь для просмотра всего текста
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| private void createButtons(final int columns, final int rows, final GridLayout field) {
// post action надо, потому что дальше в коде наше поле делаем квадратным
field.post(new Runnable() {
@Override
public void run() {
ViewGroup.LayoutParams fieldParams = field.getLayoutParams(); // берем параметры поля (лаяута)
int size = Math.min(field.getWidth(), field.getHeight()); // определяем меньшую сторону
fieldParams.width = size; // делаем стороны одинаковыми, квадрат
fieldParams.height = size;
field.setLayoutParams(fieldParams); // применяем новые параметры
field.setColumnCount(columns); // задаем полю количество столбцов
field.setRowCount(rows); // и строк
// цикл в котором создаются кнопки
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
Button btn = new Button(field.getContext());
btn.setOnClickListener(listener); // вешаем слушателя
btn.setTag(c + " " + r); // назначаем tag на вьюшку, пригодится когда надо будет определить позицию на поле
btn.setTextSize(7); // это можно убрать
btn.setText("" + (c + 1) * (r + 1)); // проставляем цифры на кнопках, тоже потом в топку
GridLayout.LayoutParams lp = new GridLayout.LayoutParams(); // создаем параметры лаяута для кнопки
lp.width = 0; // так надо потому что ниже мы указываем вес кнопок = 1, они будут сами высчитывать размеры
lp.height = 0;
lp.columnSpec = GridLayout.spec(c, 1f); // вес и позиция кнопки по горизонтали
lp.rowSpec = GridLayout.spec(r, 1f); // и по вертикали
field.addView(btn, lp); // добавляем кнопку на поле
}
}
}
});
}
private final View.OnClickListener listener = new View.OnClickListener() { // слушатель для кнопок (с) кэп
@Override
public void onClick(View v) {
String[] arr = v.getTag().toString().split(" ");
int col = Integer.valueOf(arr[0]);
int row = Integer.valueOf(arr[1]);
Toast.makeText(getBaseContext(), "Button Pressed col: " + col + " row: " + row, Toast.LENGTH_SHORT).show();
}
}; |
|
4. PTOFIT
и что получилось
И потом, я бы заменил кнопки на ImageView или вообще на свои, кастомные вьюшки чтобы удобно менять картинки на них.
Вернуться к обсуждению:
Динамическая кнопка с картинкой Программирование Android