Android — Квадратный макет таблицы

Мне нужно создать идеальный квадратный TableLayout. Таблица представляет собой сетку объектов одинакового размера. Проблема здесь в том, что в альбомной верстке таблица должна занимать максимальное количество места, но не более того. Другими словами, мне нужна ширина таблицы, равная максимально допустимой высоте. Объявление появляется примерно через 10 секунд после начала действия, что также усложняет задачу.

Вот что я пытался сделать до сих пор:

  • Я создал невидимый вид, который был выровнен по центру по горизонтали. Затем я выровнял правую часть таблицы по этому представлению. Это работает, но для некоторых устройств соотношение экрана не делает эту настройку идеальной. На устройствах типа дроида нижний ряд сжат, потому что ширина стола меньше высоты.
  • Я создал ImageView с параметром AdjustViewBounds, для которого установлено значение true. Я получил его с очень большим квадратным изображением. Я установил его выше adView и выровнял сверху и выровнял по левому краю. Затем я устанавливаю макет таблицы так, чтобы он соответствовал границам этого ImageView. Это не сработало, потому что это потребляло память, а границы изображения никогда не настраивались полностью, когда появлялось объявление. Источник изображения перейдет к меньшему масштабированному квадрату, но правая граница никогда не адаптируется к новым границам.

Я думаю, это было бы очень просто, если бы я создал собственный класс TableLayout и установил tablewidth = tableheight. Я борюсь с этой идеей, потому что я не знаю, где все, что мне нужно, разместить необходимую логику. Я предполагаю, что мне нужно будет добавить его, когда таблица будет первоначально нарисована, и снова, когда таблица подстроится после того, как объявление переместится на место.

Может ли кто-нибудь помочь с примером кода в классе TableLayout? Есть ли другой способ сделать это?

Обновление от 30 марта, 21:05 по тихоокеанскому стандартному времени

Я добился некоторого прогресса с пользовательским классом TableLayout после просмотра предложения CommonsWare. Я ближе к достижению решения с использованием этого класса, но осталось решить одну проблему. Новый TableLayout не регулирует свои границы, поэтому ширина по-прежнему занимает дополнительное пространство, даже если размер содержимого правильный. Ширина выглядит установленной, когда нет рекламы, и после этого она никогда не меняется.

Вот мой очень простой расширенный класс TableLayout. Обратите внимание на метод onMeasure, в котором я устанавливаю ширину и высоту равными высоте:

public class SquareTableLayout extends TableLayout {

    public SquareTableLayout(Context context) {
        super(context);
    }
    public SquareTableLayout (Context context, AttributeSet attrs) { super(context, attrs); }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(heightMeasureSpec, heightMeasureSpec);
    }
}

Вот скриншот проблемы. Я добавил фиолетовый фон в TableLayout, чтобы подчеркнуть проблему.

http://ribzy.com/images/tile_takedown_landscape.png


person ravishi    schedule 31.03.2011    source источник
comment
Спасибо, но изображение не существует. Вы решили проблему?   -  person CoolMind    schedule 04.07.2018


Ответы (1)


TableLayout не может выполнить то, что вы ищете, по причинам, которые вы определили. Не существует встроенного макета, в котором есть понятие связывания ширины и высоты вместе. Скорее всего, вам нужно будет создать собственный менеджер компоновки с нуля, подобный этому.

person CommonsWare    schedule 31.03.2011