Jeśli obejrzysz wykład, który wygłosiłem podczas dnia Devoxx University (dostępny na parleys.com ), dowiesz się, jak to zrobić samodzielnie. Podczas wykładu napisałem FlowLayoutimplementację na żywo na scenie, aby pokazać, jak proste jest pisanie niestandardowych układów.
dzięki romain, to naprawdę pomaga. co powiesz na podanie rozwiązania? lub link? ... Nie rozumiem, w jaki sposób Twoja odpowiedź została przyjęta.
Johann Hilbold
4
@JohannHilbold: Właśnie dodałem linki
Macarse
7
Czytelnicy powinni mieć świadomość, że kod w odsyłaczu zawiera poważne problemy i jest daleki od rozwiązania typu drop-in. Miałem już dwa poważne problemy w tej małej bazie kodu. Nie będę publikował poprawek, ponieważ są to rozwiązania taśm klejących dla moich szczególnych potrzeb ...
Nemanja Kovacevic
6
Nigdy nie twierdziłem, że to było idealne :)
Romain Guy
19
@RomainGuy chodzi o to, że może w końcu nie jest to takie proste.
Jeffrey Blattman
72
Należy używać FlexboxLayoutz flexWrap="wrap"atrybutem.
<com.google.android.flexbox.FlexboxLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"app:flexWrap="wrap"><!-- contents go here --></com.google.android.flexbox.FlexboxLayout>
To powinno być oznaczone jako rozwiązanie! Jak dotąd najlepsza odpowiedź na ten problem
x10sion
1
Aby dodać do tej odpowiedzi, ta biblioteka ma również LayoutManager, jeśli chcesz uzyskać ten efekt w RecyclerView
Ari
1
Bingo, bango, bongo. Wspaniała biblioteka do korzystania z Flexbox w systemie Android. Niezłe.
Joshua Pinter
23
Nie mam wystarczającej reputacji, aby opublikować komentarz do odpowiedzi Romaina Guya, ale właśnie tam powinna być ta odpowiedź (utworzyłem konto tylko po to, aby udostępnić moją zmianę).
W każdym razie widzę, że inni ludzie odkryli, że jego całkiem fajne rozwiązanie FlowLayout ma pewne problemy. Sam mogłem go znaleźć i widziałem, jak inne, że niektóre dzieci zostały obcięte. Patrząc szczegółowo na algorytm, wydaje się, że jest to bardzo prosty błąd w obliczaniu wysokości. Kiedy ostatnie dziecko umieszczane jest w nowej linii, wysokość nie została poprawnie obliczona. Poprawiłem trochę obliczenia (było dziwne użycie „wysokości” w porównaniu z currentHeight).
Następująca zmiana rozwiązuje problem „ostatnie dziecko jest obcięte, jeśli znajduje się w nowej linii”:
Drapałem się po głowie od 2 godzin i tylko ten fragment kodu działał dla mnie !! Czy możesz podać układ przepływu dla RadioGroup?
Pratik Saluja
Chcę też wiedzieć, jak używać marginesu? margin = 10dp pochodzi poprawnie z układu.
Pratik Saluja
1
@Pratik, jeśli masz małą grupę RadioGroup i chcesz, aby obok niej były wyświetlane inne widoki, jeśli jest miejsce i przepływ do następnej linii, jeśli nie ma miejsca, FlowLayout powinien działać dobrze. Duża pozioma RadioGroup, która powoduje, że jej elementy RadioButton przepływają do następnego wiersza, gdy w pierwszym wierszu nie ma miejsca, wymagałoby napisania niestandardowej klasy typu RadioGroup, ponieważ RadioGroup rozszerza LinearLayout. Możesz napisać niestandardową klasę RadioGroup, korzystając z pomysłów z tej klasy FlowLayout. Jak dotąd nie miałem potrzeby używania przycisków radiowych. Zwykle używamy Spinners lub innych formantów.
jk7
@Pratik, można ustawić wszystkie marginesy ze android:layout_margin="10dp"w pliku layoutu, lub ustawić indywidualne marginesy z atrybutami, takimi jak android:layout_marginLeft="10dp", android:layout_marginTop="4dp", ..etc.
jk7
0
Ładny, prosty, samodzielny kod FlowLayout tutaj (tylko kilka zwięzłych plików gist.github) :
W ConstraintLayout jest teraz wbudowana obsługa za pomocą widżetu Flow. Ma wiele opcji, które można wykorzystać do osiągnięcia wielu rodzajów przepływów.
Odpowiedzi:
Jeśli obejrzysz wykład, który wygłosiłem podczas dnia Devoxx University (dostępny na parleys.com ), dowiesz się, jak to zrobić samodzielnie. Podczas wykładu napisałem
FlowLayout
implementację na żywo na scenie, aby pokazać, jak proste jest pisanie niestandardowych układów.Implementacja jest hostowana tutaj .
źródło
Należy używać
FlexboxLayout
zflexWrap="wrap"
atrybutem.Aby uzyskać instrukcje kompilacji, zobacz repozytorium github.
Więcej na ten temat - https://android-developers.googleblog.com/2017/02/build-f flexible - layouts - with.html
źródło
Nie mam wystarczającej reputacji, aby opublikować komentarz do odpowiedzi Romaina Guya, ale właśnie tam powinna być ta odpowiedź (utworzyłem konto tylko po to, aby udostępnić moją zmianę).
W każdym razie widzę, że inni ludzie odkryli, że jego całkiem fajne rozwiązanie FlowLayout ma pewne problemy. Sam mogłem go znaleźć i widziałem, jak inne, że niektóre dzieci zostały obcięte. Patrząc szczegółowo na algorytm, wydaje się, że jest to bardzo prosty błąd w obliczaniu wysokości. Kiedy ostatnie dziecko umieszczane jest w nowej linii, wysokość nie została poprawnie obliczona. Poprawiłem trochę obliczenia (było dziwne użycie „wysokości” w porównaniu z currentHeight).
Następująca zmiana rozwiązuje problem „ostatnie dziecko jest obcięte, jeśli znajduje się w nowej linii”:
źródło
Istnieje biblioteka Google o nazwie „flexbox-layout” . Powinieneś to sprawdzić.
Aby użyć go w RecyclerView, możesz użyć czegoś takiego:
źródło
Podobnie jak jedna z poprzednich odpowiedzi, zacząłem od rozwiązania tutaj: http://hzqtc.github.io/2013/12/android-custom-layout-flowlayout.html
Rozszerzyłem go, aby uwzględnić różne wzrosty dzieci, jak poniżej.
Użyłem tego jako rozwiązania do zawijania wielu wierszy TextEdits. Mam nadzieję, że to pomoże!
źródło
Oto klasa niestandardowa, w której można uzyskać układ, taki jak następujący, dodając dynamiczny widok (zwany również FlowLayout).
Przykład:
text_view.xml
activity_flow_layou_demo.xml
FlowLayouDemo.java
źródło
Wersja @MattNotEquals () FlowLayout, która obsługuje MarginLayoutParams.
To tylko minimalistyczna implementacja MarginLayoutParms do obsługi marginesów lewy, prawy, górny i dolny.
źródło
android:layout_margin="10dp"
w pliku layoutu, lub ustawić indywidualne marginesy z atrybutami, takimi jakandroid:layout_marginLeft="10dp"
,android:layout_marginTop="4dp"
, ..etc.Ładny, prosty, samodzielny kod FlowLayout tutaj (tylko kilka zwięzłych plików gist.github) :
http://hzqtc.github.io/2013/12/android-custom-layout-flowlayout.html
Jednak aktywność po wyjęciu z pudełka nie pomogła mi załadować niestandardowego układu.
Znalazłem to obejście [używając wywołania 2-param .inflate () z tego przykładu ] :
źródło
W ConstraintLayout jest teraz wbudowana obsługa za pomocą widżetu Flow. Ma wiele opcji, które można wykorzystać do osiągnięcia wielu rodzajów przepływów.
Przykład:
Spójrz na ten post: https://medium.com/@tapanrgohil/constraintlayout-flow-bye-bye-to-linerlayout-78fd7fa9b679
A tutaj: https://www.bignerdranch.com/blog/constraintlayout-flow-simple-grid-building-without-nested-layouts/
źródło