Android - Square TableLayout - PullRequest
       20

Android - Square TableLayout

1 голос
/ 31 марта 2011

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

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

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

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

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

Обновление 3/30 21:05 PST

Я добился некоторого прогресса в использовании пользовательского класса 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

1 Ответ

1 голос
/ 31 марта 2011

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

...