Chcę mieć siatkę 2x2 z przyciskami w środku. To tylko ICS, więc próbuję użyć nowego GridLayout.
Oto XML mojego układu:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
Problem polega na tym, że moje poglądy nie rozciągają się równomiernie dla każdego rzędu. Powoduje to wiele dodatkowej przestrzeni po prawej stronie mojego GridLayout.
Próbowałem ustawienia, layout_gravity="fill_horizontal"
ale dotyczy to tylko ostatniego widoku w wierszu. Oznacza to, że Komórka 1 rozciąga się do końca, aby zapewnić wystarczającą ilość miejsca dla Komórki 0.
Myśli, jak sobie z tym poradzić?
Odpowiedzi:
AKTUALIZACJA : Wagi są obsługiwane od API 21. Więcej informacji można znaleźć w odpowiedzi PaulT . ZAKOŃCZ AKTUALIZACJĘ Istnieją ograniczenia w korzystaniu z GridLayout. Poniższy cytat pochodzi z dokumentacji .
Oto mały przykład, który wykorzystuje widoki podrzędne LinearLayout. (Użyłem widoków przestrzennych, które zajmują nieużywany obszar i popychają przyciski w żądane położenie.)
źródło
Począwszy od API 21 do GridLayout dodano pojęcie masy. Aby obsługiwać starsze urządzenia z Androidem, możesz użyć GridLayout z biblioteki obsługi v7.
Poniższy plik XML podaje przykład wykorzystania ciężarów do wypełnienia szerokości ekranu.
źródło
FrameLayout
która zawierałaButton and an
ImageView` (w celu uzyskania ikony nałoży na przycisk, który pokazał zwrotne wizualne przy dotknięciu ... długa historia) jako część klawiatury. UstawieniecolumnWeight
igravity
na każdym innymButton
działało dobrze, ale zepsuło sięFrameLayout
. Pozostawiając to tylko dlaFrameLayout
gotowego wszystko układa się równomiernie zgodnie z oczekiwaniami.Appcompat21 GridLayout ma wagi kolumn i wierszy, których można użyć jak poniżej, aby równomiernie utworzyć każdy element siatki w gridlayout, jak na powyższym obrazku.
źródło
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Począwszy od API 21 bez biblioteki obsługi v7 z ScrollView:
XML:
źródło
Możesz dynamicznie ustawić szerokość każdego dziecka:
źródło
useDefaultMargins="true"
- działa z nimi idealniefalse
Spróbuj dodać następujące dane do specyfikacji GridLayout. To powinno działać.
źródło
To jest właściwa odpowiedź
źródło
W końcu znalazłem rozwiązanie. Jak powiedział Rotemmiz, musisz później zrobić to dynamicznie. Ten kod rozciąga przyciski, aby wypełnić widok w poziomie, ale to samo można zrobić w pionie.
(20 jest dla wewnętrznego i zewnętrznego wypełnienia i marginesów. Można to zrobić bardziej uniwersalnie, ale jest to o wiele czystsze)
Następnie można go nazwać tak:
Należy to zrobić z obserwatorem, ponieważ musimy poczekać na narysowanie widoku, zanim wywołamy widoki.
źródło
W moim przypadku przyciski dodawałem dynamicznie, więc moje rozwiązanie wymagało części XML i części Java. Musiałem znaleźć i miksować rozwiązania z kilku różnych miejsc i pomyślałem, że podzielę się nimi tutaj, aby ktoś inny, szukający podobnego rozwiązania, mógł uznać to za pomocne.
Pierwsza część mojego pliku układu XML ...
grid:useDefaultMargins="true"
nie jest wymagane, ale dodałem, ponieważ wyglądało to dla mnie lepiej, możesz zastosować inne efekty wizualne (np. wypełnienie), jak wspomniano w niektórych odpowiedziach tutaj. Teraz przyciski, ponieważ muszę je dodawać dynamicznie. Oto część mojego kodu Java do tworzenia tych przycisków. Podaję tylko te wiersze związane z tym kontekstem. Załóżmy, że muszę utworzyć przyciski z tylumyOptions
dostępnych dla mojego kodu i nie kopiuję również kodu OnClickListener.Ponieważ używamy GridLayout z biblioteki wsparcia, a nie standardowej GridLayout, musimy powiedzieć o tym ocenę w
YourProject.grade
pliku.źródło
Możesz to zrobić szybciej, zastępując metodę ViewGroup onLayout. To jest moje uniwersalne rozwiązanie:
EDYCJA: Nie zapomnij match_parent dla dzieci!
źródło
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
Najlepszym rozwiązaniem, jakie mogłem znaleźć, jest użycie układu liniowego (poziomego) dla każdego wiersza, który chcesz, i przypisanie mu szerokości przycisku (komórki) do 0dp i wagi do 1. Dla każdego układu liniowego (wierszy) przypisz wysokość do 0dp, a waga do 1. Znajdź kod poniżej - także android: layout_gravity = "center_vertical" służy do wyrównywania przycisków w rzędzie, jeśli zawierają tekst o zmiennej długości. Użycie 0dp i zważenie to całkiem fajna, ale mało znana sztuczka.
źródło
Tu masz :
źródło
Chciałem mieć wyśrodkowaną tabelę z wyrównanymi do prawej etykietami i wyrównanymi do lewej wartościami. Dodatkowa przestrzeń powinna znajdować się wokół stołu. Po wielu eksperymentach i nieprzestrzeganiu tego, co dokumentacja mówi, że powinienem zrobić, wymyśliłem coś, co działa. Oto co zrobiłem:
To wydaje się działać, ale GridLayout pokazuje komunikat:
„Ten układ GridLayout lub jego element nadrzędny LinearLayout jest bezużyteczny”
Nie jestem pewien, dlaczego jest to „bezużyteczne”, gdy działa dla mnie.
Nie jestem pewien, dlaczego to działa lub czy jest to dobry pomysł, ale jeśli spróbujesz i może zaoferować lepszy pomysł, drobną poprawę lub wyjaśnienie, dlaczego to działa (lub nie działa), byłbym wdzięczny za informację zwrotną.
Dzięki.
źródło
To dość stare pytanie, ale oczywiście interesujące dla wielu osób. W przypadku prostego układu 4 takich przycisków wydaje się, że TableLayout jest najprostszym sposobem na osiągnięcie pożądanego rezultatu.
Oto przykładowy kod pokazujący pierwsze 2 wiersze tabeli z 6 kolumnami obejmującymi szerokość jej elementu nadrzędnego. LinearLayout i ImageView w każdej komórce służą do „włączania i wyłączania” obrazu w komórce przy zachowaniu koloru komórki.
źródło
Stare pytanie, ale chciałem dodać moje rozwiązanie. Stworzyłem „liniowy układ siatki”, który symuluje siatkę, ale używając zagnieżdżonych układów liniowych. Pozwala to na rozciąganie, aby wypełnić przestrzeń.
źródło
Chciałbym, żeby to komuś pomogło
Wynik
Kod:
źródło
Wynik:
Wypróbuj coś takiego:
Jeśli chcesz mieć określoną szerokość i wysokość dla swoich komórek, użyj:
źródło
To jest kod dla bardziej domyślnej aplikacji bez przycisków, jest to dla mnie bardzo przydatne
źródło
mam ten sam problem i myślę, że po prostu ustawiam szerokość i wysokość programowo:
Ustaw szerokość przycisków za pomocą metrics.widthPixels / 2 metrics jest obiektem DisplayMetrics.
źródło
możesz tu znaleźć wszystkie samouczki, układ siatki Android z CardView i OnItemClickListener
źródło
Oto co zrobiłem i cieszę się, że to dla mnie zadziałało. Ja też chciałem siatkę przedmiotów 2x2, 3x3 itd., Która pokryłaby cały ekran. Siatki nie przylegają do szerokości ekranu. LinearLayouts to rodzaj pracy, ale nie można używać obciążników zagnieżdżonych.
Najlepszym rozwiązaniem dla mnie było używać Fragmenty użyłem tego samouczku, aby zacząć od tego, co chciałem zrobić.
Oto kod:
Główna aktywność:
activity_main_6 XML (napompowuje 3 fragmenty)
Podstawowy układ fragmentów
Klasa fragmentów (obsługuje tylko inicjalizację widoku niestandardowego) napompowuje 2 płytki na fragment
}
Otóż to!
Zasadniczo jest to dziwne obejście używania zagnieżdżonych obciążników. Daje mi idealną siatkę 2x3, która wypełnia cały ekran mojego 10-calowego tabletu i mojego HTC droid DNA. Daj mi znać, jak ci idzie!
źródło