Android менеджер раскладок - раскладка у детей
Я создал собственный менеджер макетов, полученный из LinearLayout. (Я на самом деле не использую большую часть функциональности LinearLayout, но я не хочу заботиться обо всех многих абстрактных методах ViewGroup.) Я перезаписал только
protected void onLayout(boolean changed, int l, int t, int r, int b)
метод и я вызываю child.layout(...) в MyLayout.onLayout(...) для каждого из его дочерних элементов. Все остальное - оригинал LinearLayout. Это будет работать нормально, и дети будут правильно размещены в родительском MyLayout, если дети - простые контроли без детей (внуки MyLayout).
Проблемы возникают, когда я использую некоторые ViewGroup (LinearLayout, ViewSwitcher, ...) с детьми как потомок MyLayout. В этом случае дети (из MyLayout) размещены хорошо, но внуки (из MyLayout) внутри каждого ребенка нет. Кажется, параметры и значения, такие как wrap_content, fill_parent, layoutWeight, обрабатываются неправильно. Например, ViewSwitcher в MyLayout не отображает его содержимое, потомки LinearLayouts (потомок MyLayout) (внуки MyLayout) с fill_parent имеют размер 0px, иногда CompoundButton (потомок MyLayout) не показывает его текст...
Кажется, child.layout(...) в MyLayout.onLayout правильно устанавливает размер и положение каждого дочернего элемента, но мне нужно вызвать какой-то другой метод, чтобы компоновка каждого дочернего элемента работала хорошо (если дочерним элементом является ViewGroup с дочерними элементами). Есть что-то подобное или MyLayout с только что измененным onLayout должен хорошо работать?
Спасибо за все советы.
1 ответ
Похоже, вам нужно переопределить onMeasure и вызвать measure() для каждого из дочерних элементов. если ваши дети - это группы представлений, а внуки - это представления, то вы хотите пройтись по детям и вызвать меры (int, int). тогда дети должны вызвать меру на внуков.
взгляните на источник linearLayout: http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.6_r1/android/widget/LinearLayout.java#LinearLayout.onMeasure%28int,int%29