Программно размер представления зависит от версии Android? - PullRequest
0 голосов
/ 24 октября 2010

Я сталкиваюсь со странным поведением в отношении предмета.

У меня очень простая раскладка, содержащая только пустую RelativeLayout .

Как только у меня есть форма ввода от пользователяэто относительное расположение заполнено квадратными плитками, чтобы достигнуть подобного мозаике эффекта.Каждая плитка сделана с помощью FrameLayout, содержащего два изображения (в каждый момент времени рисуется только одно).Я не могу поместить плитки в макет XML, потому что я заранее не знаю, сколько из них мне понадобится.

В onSizeChanged моего относительного макета япринудительно изменить размер всех плиток, чтобы соответствовать новому размеру.

Код выглядит примерно так:

public void resizeTiles(int w, int h) {
    int l1 = w / X; int l2 = h / Y;
    int tileS = (l1 <= l2 ? l1 : l2);
    android.view.ViewGroup.LayoutParams lp;
    for (Tile t : myTiles) {
        lp = t.getLayoutParams();
        lp.width = tileS;
        lp.height = tileS;
    }
}

В моем файле манифеста у меня есть следующее:

<uses-sdk 
    android:minSdkVersion="4"
    android:targetSdkVersion="4"
/>

Таким образом, целевая система - 1.6.

Пока все хорошо, это работает как шарм ... но только на 2.2.

Тот же двоичный файл, помещенный в эмулятор 2.1-update1или предыдущий возвращает мне пустой макет (я также попробовал несколько физических устройств, тот же результат).

Отладка, я отследил проблему в изменении размера;комментируя назначения ширины и высоты, я вижу плитки, но с искаженными пропорциями.

Любое предложение о том, как заставить это работать?

Заранее спасибо.

1 Ответ

3 голосов
/ 25 октября 2010

onSizeChanged () вызывается поздно в процессе компоновки, как только окончательный размер был определен.Возможно, уже были некоторые проходы макета, которые произошли вниз по иерархии в этой точке.

Основной ответ: параметры макета предназначены для того, чтобы сообщить родителю представления, что выполняется параметры макета, до которых выполняет.макет.Если они изменяются, макет должен быть признан недействительным, чтобы выполнить новый полный макет с новыми параметрами.Никогда не изменяйте их в середине макета.

Лучше всего написать собственный менеджер макета.(Если вы делаете разметку плиток, RelativeLayout делает на тонну больше материала, который вам не нужен, что делает его намного менее эффективным, чем необходимо.) На самом деле написать простой менеджер раскладки не очень сложно..

В качестве руководства можно использовать простые менеджеры компоновки в структуре:

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/AbsoluteLayout.java

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/FrameLayout.java

(Обратите внимание, что даже этинамного сложнее, чем вам, вероятно, нужно, так как они предназначены для общего использования макетов, которые они реализуют. У нас действительно должна быть демонстрация API пользовательского макета, который действительно прост.)

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