Jak mogę zmienić rozmiar widoku na podstawie rozmiaru jego układu nadrzędnego. Na przykład mam element, RelativeLayout
który wypełnia cały ekran i chcę, aby widok podrzędny, powiedzmy an ImageView
, zajmował całą wysokość i 1/2 szerokości?
Próbowałem nadrzędnymi wszystko na onMeasure
, onLayout
, onSizeChanged
, itp i nie mogę zmusić go do pracy ....
Odpowiedzi:
Nie wiem, czy ktoś nadal czyta ten wątek, czy nie, ale rozwiązanie Jeffa zaprowadzi cię tylko do połowy (trochę dosłownie). To, co zrobi jego onMeasure, to wyświetlenie połowy obrazu w połowie rodzica. Problem polega na tym, że wywołanie super.onMeasure przed wywołaniem
setMeasuredDimension
spowoduje zmierzenie wszystkich elementów podrzędnych w widoku na podstawie oryginalnego rozmiaru, a następnie po prostu przecięcie widoku na pół podczas zmianysetMeasuredDimension
rozmiaru.Zamiast tego musisz zadzwonić
setMeasuredDimension
(zgodnie z wymaganiami dla zastąpienia onMeasure) i podać nowyLayoutParams
widok, a następnie zadzwonićsuper.onMeasure
. Pamiętaj, żeLayoutParams
pochodzą one od typu nadrzędnego widoku, a nie typu widoku.Uważam, że jedyny przypadek, w którym będziesz mieć problemy z rodzicem,
LayoutParams
to sytuacja, w której rodzic jestAbsoluteLayout
(co jest przestarzałe, ale czasami jest przydatne).źródło
MeasureSpec.getSize(widthMeasureSpec)
naprawdę podaje prawidłową szerokość rodzica? Dla mnie to po prostu zwraca losowe szerokości, które są dość zbliżone do rzeczywistej szerokości, ale nie są dokładne.wrap_content
nie. Odpowiedź Vica nie działa w tym scenariuszu, ale komentarz @ M.Schenk tak. Zapisuje również dodatkowy przebieg układu. Powinieneś również opublikować to jako odpowiedź na widoczność.super.onMeasure()
po prostu przesłonić i unieważnić efekty wcześniejszego wywołaniathis.setMeasuredDimension()
?super.onMeasure()
nie zastępuje wcześniejszych obliczeń.Możesz rozwiązać ten problem, tworząc niestandardowy widok i nadpisując metodę onMeasure (). Jeśli zawsze używasz „fill_parent” jako layout_width w swoim xml, wówczas parametr widthMeasureSpec, który jest przekazywany do metody onMeasusre (), powinien zawierać szerokość elementu nadrzędnego.
Twój XML wyglądałby mniej więcej tak:
źródło
Przekonałem się, że najlepiej nie majstrować przy samodzielnym ustawianiu mierzonych wymiarów. Właściwie jest trochę negocjacji, które toczą się między widokami nadrzędnymi i podrzędnymi i nie chcesz ponownie pisać całego tego kodu .
Możesz jednak zmodyfikować parametry MeasureSpec, a następnie wywołać z nimi super. Twój widok nigdy się nie dowie, że otrzymuje zmodyfikowaną wiadomość od swojego rodzica i zajmie się wszystkim za Ciebie:
źródło
Podczas definiowania układu i widoku w formacie XML można określić szerokość i wysokość układu widoku, aby był zawijaną zawartością lub elementem nadrzędnym wypełnienia. Zajęcie połowy obszaru jest nieco trudniejsze, ale gdybyś miał coś, czego chciałeś na drugiej połowie, możesz zrobić coś takiego.
Nadanie dwóm rzeczom tej samej wagi oznacza, że rozciągną się, aby zająć tę samą część ekranu. Więcej informacji na temat układów można znaleźć w dokumentacji deweloperskiej.
źródło
Uważam, że podejście XML firmy Mayras może przyjść całkiem nieźle . Można jednak zwiększyć dokładność, mając tylko jeden widok, ustawiając weightSum. Nie nazwałbym tego już hackiem, ale moim zdaniem najprostszym podejściem:
W ten sposób możesz użyć dowolnej wagi, na przykład 0,6 (i wyśrodkowanie) to waga, którą lubię używać dla przycisków.
źródło
Spróbuj tego
wtedy możesz użyć LinearLayout.LayoutParams do ustawienia parametrów chileView
źródło
Możesz teraz używać PercentRelativeLayout. Bum! Problem rozwiązany.
źródło
Roman, jeśli chcesz zrobić swój układ w kodzie Java (potomek ViewGroup), jest to możliwe. Rzecz w tym, że musisz zaimplementować zarówno metody onMeasure, jak i onLayout. OnMeasure jest wywoływany jako pierwszy i musisz tam „zmierzyć” podgląd (efektywnie dostosowując go do żądanej wartości). Musisz ponownie zmienić rozmiar w wywołaniu onLayout. Jeśli nie wykonasz tej sekwencji lub nie wywołasz metody setMeasuredDimension () na końcu kodu onMeasure, nie uzyskasz wyników. Dlaczego jest to zaprojektowane w tak skomplikowany i delikatny sposób, jest poza mną.
źródło
Jeśli druga strona jest pusta. Myślę, że najprostszym sposobem byłoby dodanie pustego widoku (np. Układu liniowego), a następnie ustawienie szerokości obu widoków na fill_parent i obu ich wag na 1.
Działa to w LinearLayout ...
źródło
To jest coś takiego:
źródło
Od dłuższego czasu zmagam się z tym pytaniem, chcę zmienić szerokość szuflady DrawerLayout, która jest drugim dzieckiem jej rodzica. Niedawno to wymyśliłem, ale nie wiem, czy jest lepszy pomysł.
źródło