TableLayout изменяет размеры представления при изменении размера текста, даже если это фиксированный размер - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть несколько квадратных TextViews в TableLayout. Я должен изменить размер текста программно. Не могу использовать новое «авторазмер», мне нужно самому установить размер текста.

Итак, мой подход состоит в том, чтобы иметь фиксированные layout_height и layout_width для TextViews в макете таблицы и использовать setTextSize в коде.

Проблема в том, что как только размер текста изменяется, начинают происходить странные вещи, причем не только с редактируемой TextView / ячейкой, но и с соседними!

При первом изменении размера текста затрагивается соседняя ячейка (см. Изображение). Это происходит как на реальном телефоне (API24), так и на эмуляторе (API 24, 28). При изменении размера текста во второй раз вторая ячейка возвращается в нормальное состояние на эмуляторе. На реальном устройстве размер первой ячейки снова изменяется или верхнее поле увеличивается.

layout problems

Я пытался изменить различные настройки для TableLayout, TableRow и TextView (wrap_content, min / max Height), но ничто не решает проблему, за исключением комментирования setTextSize.

Мне нужно использовать TableLayout, поэтому заменить его на другой макет мне не вариант.

Почему это не работает?

Чтобы воспроизвести проблему, вставьте приведенный ниже макет и код в новый проект «пустое действие». На момент написания этой статьи я использовал новейшее программное обеспечение (Android Studio 3.2.1 с компиляцией SDK версии API 28, Java версии 1.8, min SDK версии 22.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:baselineAligned="false"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mainContainer">

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/tableLayout1"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="#000">

        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <TextView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="#FFF"
                android:textColor="#000"
                android:id="@+id/textView1"
                android:layout_margin="1dp"/>

            <TextView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="#FFF"
                android:textColor="#000"
                android:layout_margin="1dp"/>

        </TableRow>

    </TableLayout>


        <Button
            android:layout_gravity="bottom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Click"
            android:id="@+id/button1"/>

   </LinearLayout>

Код моей активности:

package app.howsmydriving.layoutproblem;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {


    private String sContent = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                sContent += "A";
                TextView tv = findViewById(R.id.textView1);
                tv.setText(sContent);

                if(sContent.length() < 3) {
                    tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
                } else {
                    tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
                }
            }

        });
    }



    }

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Первое, что нужно понять, это то, что на самом деле означает android:baselineAligned.

Этот атрибут по умолчанию установлен на true и управляет вертикальным расположением брата TextView s внутри горизонтального LinearLayout. TextView s будет сдвигаться вверх или вниз по мере необходимости, чтобы убедиться, что все базовые линии текста (воображаемая линия, на которой находится текст) выровнены.

enter image description here

Следующее, что нужно понять, это то, что TableRow является подклассом LinearLayout и является горизонтальным.

Итак, если вы хотите полностью контролировать вертикальное расположение TextView s внутри вашего TableRow, вам следует установить android:baselineAligned="false", чтобы избежать переопределения системой.

enter image description here

Редактировать

Размеры TextView не влияют на выравнивание базовой линии; LinearLayout будет (а) перемещать TextView сами вверх и вниз по мере необходимости и (б) перемещать текст в пределах TextView вверх и вниз по мере необходимости, чтобы убедиться, что базовые линии выравнивать.

Вот демо. Я установил цвета фона, чтобы сделать все очень очевидным. Родитель LinearLayout имеет фиксированную высоту 100dp, первый TextView равен wrap_content, второй 40dp (больше, чем нужно), а третий 16dp (меньше его) должно быть).

enter image description here

Это все для того, чтобы убедиться, что базовые линии совпадают. LinearLayout сделает все необходимое, чтобы это произошло, если вы не отключите выравнивание базовой линии.

0 голосов
/ 13 ноября 2018

Мне удалось это исправить, отключив baselineAligned для LinearLayout, TableLayout и TableRow:

android:baselineAligned="false"

Не уверен, почему это работает, если у кого-то есть лучшее объяснение, я приму это как ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...