Отрисовка матрицы TextView в LinearLayout
Недавно решил написать игру в android, под названием "2048". Идея не моя, решил попробовать просто повторить. И столкнулся с одной проблемой. Видите ли, решил подстроить само поле игры под экраны разных устройств. И так как у меня поле это квадрат, то я решил попробовать сторону этого квадрата сделать равной ширине экрана телефона/планшета. Поначалу думал просто уже имеющийся LinearLayout подстроить через setLayoutParams(), но мне попалась ошибка classCastException, мол нельзя устанавливать параметры для LinearLayout на ConstraintLayout. Ладно, думаю. Через обходники пошёл, создал ещё один LinearLayout и попытался засунуть в имеющиеся. Вся матрица испортилась и виден лишь один ряд TextView. Итак вопрос. Как мне можно изменить параметры первоначального LinearLayout или добавить новый с заданными параметрами в Layout с параметрами MATCH_PARENT, MATCH_PARENT? Очень прошу помочь. Чем можете.
Этот код находит ширину экрана:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
Вот код отрисовки поля:
public class Field {
static int size = 4;
static TextView[][] field = new TextView[size][size];
static String[][] field_values = new String[size][size];
public static void setField_values() {
Field.field_values[0][1] = "2048";
}
static int BLOCK_SIZE;
public static void createField() {
BLOCK_SIZE = width/4;
LinearLayout toPrint = new LinearLayout(canvas.getContext());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(MATCH_PARENT, width);
for (int y = 0; y < field.length; y++) {
LinearLayout ln = new LinearLayout(MainActivity.canvas.getContext());
ln.setGravity(Gravity.CENTER);
ln.setVisibility(View.VISIBLE);
for (int x = 0; x < field[y].length; x++) {
TextView txt = new TextView(MainActivity.canvas.getContext());
txt.setVisibility(View.VISIBLE);
txt.setGravity(Gravity.CENTER);
txt.setTextSize(20);
switch (String.valueOf(field_values[y][x])){
case "2":
txt.setBackgroundResource(R.drawable.ic_block_2);
break;
case "4":
txt.setBackgroundResource(R.drawable.ic_block_4);
break;
case "8":
txt.setBackgroundResource(R.drawable.ic_block_8);
break;
case "16":
txt.setBackgroundResource(R.drawable.ic_block_16);
break;
case "32":
txt.setBackgroundResource(R.drawable.ic_block_32);
break;
case "64":
txt.setBackgroundResource(R.drawable.ic_block_64);
break;
case "128":
txt.setBackgroundResource(R.drawable.ic_block_128);
break;
case "256":
txt.setBackgroundResource(R.drawable.ic_block_256);
break;
case "512":
txt.setBackgroundResource(R.drawable.ic_block_512);
break;
case "1024":
txt.setBackgroundResource(R.drawable.ic_block_1024);
break;
case "2048":
txt.setBackgroundResource(R.drawable.ic_block_2048);
break;
}
if(field_values[y][x] == null){
txt.setBackgroundResource(R.drawable.ic_block_default);
}
txt.setTextColor(Color.WHITE);
txt.setLayoutParams(new ViewGroup.LayoutParams(BLOCK_SIZE, BLOCK_SIZE));
txt.setText(field_values[y][x]);
field[y][x] = txt;
ln.addView(txt);
}
toPrint.addView(ln, LinearLayout.HORIZONTAL);
}
toPrint.setGravity(Gravity.CENTER);
canvas.addView(toPrint,lp);
//LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, width);
//canvas.setLayoutParams(lp); classCastException
if(winCheck()){
Menu.ifWin();
}
}
public static void cleanField() {
for (int y = 0; y < field.length; y++) {
for (int x = 0; x < field[y].length; x++) {
TextView textView = new TextView(MainActivity.canvas.getContext());
textView.setText("");
field[y][x] = textView;
}
}
createField();
}
private static boolean winCheck(){
boolean isWin = false;
for(int y = 0; y < field_values.length; y++){
for(int x = 0; x < field_values[y].length; x++){
if(field_values[y][x] != null && field_values[y][x].equals("2048")){
isWin = true;
}
}
}
return isWin;
}
}
И ещё xml файл:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:id="@+id/application_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/game_field"
android:layout_width="match_parent"
android:layout_height="410dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/menu"
app:layout_constraintTop_toTopOf="parent">
</LinearLayout>
<LinearLayout
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:alpha="0.7"
android:background="@color/black"
android:orientation="vertical"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<TextView
android:id="@+id/menuText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="110dp"
android:layout_weight="1"
android:gravity="center"
android:text="Menu"
android:textColor="#FFFFFF"
android:textSize="40sp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.15" />
<Button
android:id="@+id/btn_continue"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="80dp"
android:layout_weight="1"
android:text="Continue"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/btn_exit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_restart"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="50dp"
android:layout_weight="1"
android:text="Restart"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/btn_continue"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_exit"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="50dp"
android:layout_marginBottom="300dp"
android:layout_weight="1"
android:text="Exit"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/menuText"
app:layout_constraintVertical_bias="0.0" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>