Widoki mają,minHeight
ale jakoś brakuje maxHeight
:
To, co próbuję osiągnąć, to wypełnienie niektórych elementów (widoków) ScrollView
. Kiedy jest 1..3 elementów, chcę je wyświetlić bezpośrednio. Oznacza to, że ScrollView
ma wysokość 1, 2 lub 3 elementów.
Gdy są 4 lub więcej elementów, chcę, ScrollView
aby przestał się rozwijać (a więc a maxHeight
) i zaczął przewijać.
Niestety nie ma sposobu, aby ustawić maxHeight
. Prawdopodobnie więc muszę ScrollView
programowo ustawić swoją wysokość na WRAP_CONTENT
1 lub 3 elementy i ustawić wysokość na 3*sizeOf(View)
4 lub więcej pozycji.
Czy ktoś może wyjaśnić, dlaczego nie ma maxHeight
, skoro już istnieje minHeight
?
(BTW: niektóre widoki, na przykład ImageView
mają maxHeight
zaimplementowane.)
Odpowiedzi:
Żadne z tych rozwiązań nie działało tak, jak potrzebowałem, czyli ScrollView ustawiony na wrap_content, ale posiadający maxHeight, aby przestał się rozwijać po pewnym momencie i zaczął przewijać. Po prostu przesłoniłem metodę onMeasure w ScrollView.
To może nie działać we wszystkich sytuacjach, ale z pewnością daje mi wyniki potrzebne do mojego układu. I odnosi się również do komentarza madhu.
źródło
W celu stworzenia
ScrollView
lubListView
z maxheight wystarczy stworzyć Transparent LinearLayout wokół niego o wysokości co chcesz maxheight być. Następnie ustaw Wysokość ScrollView nawrap_content
. Spowoduje to utworzenie ScrollView, który wydaje się rosnąć, dopóki jego wysokość nie będzie równa nadrzędnemu LinearLayout.źródło
To działało dla mnie, aby dostosować go do formatu xml:
MaxHeightScrollView.java:
attr.xml
przykładowy układ
źródło
(Wiem, że nie odpowiada to bezpośrednio na pytanie, ale może być pomocne dla innych osób poszukujących funkcjonalności maxHeight)
ConstraintLayout oferuje swoim dzieciom maksymalną wysokość
lub
Przykładowe użycie tutaj .
źródło
Skomentowałbym odpowiedź gwizdka, gdybym mógł, ale pomyślałem, że warto zauważyć, że aby rozwiązać ten problem w kontekście trybu wielu okien w Androidzie N, musiałem nieco zmienić kod na ten:
Pozwala to na zmianę rozmiaru układu na mniejszą niż maksymalna wysokość, ale także zapobiega jego zwiększeniu powyżej maksymalnej wysokości. Użyłem tej klasy układu, która zastępuje,
RelativeLayout
co pozwoliło mi stworzyć niestandardowe okno dialogowe zScrollView
dzieckiem,MaxHeightRelativeLayout
które nie rozszerza pełnej wysokości ekranu, a także kurczy się, aby zmieścić się w najmniejszym rozmiarze wdowy w wielu oknach dla Androida N.źródło
Nie ma możliwości ustawienia maxHeight. Ale możesz ustawić Wysokość.
Aby to zrobić, musisz odkryć wysokość każdego elementu przewijania scrollView. Następnie ustaw wysokość scrollView na numberOfItens * heightOfItem.
Aby odkryć wysokość przedmiotu, wykonaj następujące czynności:
Aby ustawić wysokość:
źródło
Zawiń się
ScrollView
wokół równinyLinearLayout
z layout_height = "max_height", to zrobi idealną robotę. W rzeczywistości mam ten kod w produkcji z ostatnich 5 lat bez problemów.źródło
Mój
MaxHeightScrollView
niestandardowy widokstyle.xml
Za pomocą
źródło
Mam tutaj odpowiedź:
https://stackoverflow.com/a/29178364/1148784
Wystarczy utworzyć nową klasę rozszerzającą ScrollView i zastąpić jej
onMeasure
metodę.źródło
Jak wspomniano powyżej, ConstraintLayout oferuje swoim dzieciom maksymalną wysokość poprzez:
Poza tym, jeśli maksymalna wysokość dla jednego dziecka ConstraintLayout nie jest pewna do momentu uruchomienia aplikacji, nadal istnieje sposób, aby to dziecko automatycznie dostosowało zmienną wysokość bez względu na to, gdzie zostało umieszczone w pionowym łańcuchu.
Na przykład musimy wyświetlić dolne okno dialogowe ze zmiennym nagłówkiem TextView, zmiennym ScrollView i zmienną stopką TextView. Maksymalna wysokość okna dialogowego wynosi 320dp, gdy całkowita wysokość nie osiąga 320dp ScrollView działa jak zawartość_zawija, gdy całkowita wysokość przekracza ScrollView działa jako „maxHeight = 320dp - wysokość nagłówka - wysokość stopki”.
Możemy to osiągnąć tylko poprzez plik układu xml:
Większość kodów importowych jest krótka:
Poziomy poziom maksymalnego wykorzystania jest taki sam.
źródło
Czy próbowałeś użyć wartości layout_weight ? Jeśli ustawisz jeden na wartość większą niż 0, rozciągnie ten widok na pozostałą dostępną przestrzeń.
Jeśli miałeś wiele widoków, które musiały zostać rozciągnięte, wówczas wartość stanie się wagą między nimi.
Więc jeśli miałbyś dwa widoki ustawione na wartość weight_weight 1, wówczas oba rozciągałyby się, aby wypełnić przestrzeń, ale oba rozciągałyby się na równą ilość miejsca. Jeśli ustawisz jedną z nich na wartość 2, rozciągnie się ona dwa razy bardziej niż drugi widok.
Kilka dodatkowych informacji tutaj wymienionych w części Układ liniowy.
źródło
maxHeight
który mogę ustawić na konkretną wartość spadku. (W końcu skończyłem na obliczeniach i programowo ustawiłem wysokości)Myślę, że możesz ustawić wysokość w czasie wykonywania dla 1 elementu tylko
scrollView.setHeight(200px)
dla 2 elementówscrollView.setheight(400px)
dla 3 lub więcejscrollView.setHeight(600px)
źródło
Jak wiemy, urządzenia z Androidem mogą mieć różne rozmiary ekranu. Jak dalej wiemy, widoki powinny dostosowywać się dynamicznie i stać się odpowiednią przestrzenią.
Jeśli ustawisz maksymalną wysokość, możesz zmusić widok, aby nie miał wystarczającej ilości miejsca lub zajął mniej miejsca. Wiem, że czasami wydaje się, że praktycznie można ustawić maksymalną wysokość. Ale jeśli rozdzielczość kiedykolwiek zmieni się drastycznie i będzie !, widok o maksymalnej wysokości nie będzie wyglądał odpowiednio.
myślę, że nie ma właściwego sposobu, aby dokładnie zrobić pożądany układ. zaleciłbym przemyślenie układu za pomocą menedżerów układu i mechanizmów względnych. nie wiem, co próbujesz osiągnąć, ale dla mnie to trochę dziwne, że lista powinna zawierać tylko trzy elementy, a następnie użytkownik musi przewijać.
btw. minHeight nie jest gwarantowany (i może też nie powinien istnieć). może mieć pewne zalety wymuszania widoczności przedmiotów, podczas gdy inne względne przedmioty stają się mniejsze.
źródło
Jeśli ktoś rozważa użycie dokładnej wartości dla LayoutParams np
Pamiętaj, aby wziąć pod uwagę gęstość wyświetlacza urządzenia, w przeciwnym razie możesz uzyskać bardzo dziwne zachowanie na różnych urządzeniach. Na przykład:
źródło
Najpierw uzyskaj wysokość przedmiotu w pikselach
to po prostu
źródło
jeśli chcecie zrobić widok przewijania lub listy bez przepełnienia, po prostu na RelativeLayout z widokiem od góry i od dołu u góry i u dołu:
źródło
Użyłem niestandardowego ScrollView wykonanego w Kotlin, który używa
maxHeight
. Przykład zastosowania:Oto kod
ScrollViewWidthMaxHeight
:który potrzebuje również tej deklaracji w
values/attrs.xml
:źródło