Miałem poważny problem ze sprawieniem, aby LayoutInflater działał zgodnie z oczekiwaniami, podobnie jak inne osoby: Jak używać layoutinflatora do dodawania widoków w czasie wykonywania? .
Dlaczego LayoutInflater ignoruje określone przeze mnie parametry układu? Np. Dlaczego wartości layout_width
i layout_height
z moich zasobów XML nie są honorowane?
android
android-layout
andig
źródło
źródło
Odpowiedzi:
Zbadałem ten problem, odwołując się do dokumentacji LayoutInflater i konfigurując mały przykładowy projekt demonstracyjny. Poniższe samouczki pokazują, jak dynamicznie wypełniać układ przy użyciu
LayoutInflater
.Zanim zaczniemy, zobacz, jak
LayoutInflater.inflate()
wyglądają parametry:R.layout.main_page
)attachToRoot
jesttrue
), lub po prostu obiekt, który dostarcza zestawLayoutParams
wartości dla katalogu głównego zwracanej hierarchii (jeśliattachToRoot
jestfalse
).attachToRoot : czy zawyżona hierarchia powinna być dołączona do parametru głównego? Jeśli false, root jest używany tylko do tworzenia poprawnej podklasy
LayoutParams
dla widoku głównego w XML.Zwroty : widok główny zawyżonej hierarchii. Jeśli podano root i
attachToRoot
jesttrue
, to jest to root; w przeciwnym razie jest to katalog główny zawyżonego pliku XML.Teraz przykładowy układ i kod.
Główny układ (
main.xml
):Do tego kontenera dodano oddzielny TextView, widoczny jako mały czerwony kwadrat, jeśli parametry układu zostały pomyślnie zastosowane z XML (
red.xml
):Teraz
LayoutInflater
jest używany z kilkoma odmianami parametrów połączeńRzeczywiste wyniki zmian parametrów są udokumentowane w kodzie.
SKŁADNIA: Wywołanie
LayoutInflater
bez określania głównych prowadzi do zawyżenia wywołania ignorując parametry układu z XML. Wywołanie inflate z elementem głównym nie jest równenull
iattachRoot=true
ładuje parametry układu, ale ponownie zwraca obiekt główny, co zapobiega dalszym zmianom układu w załadowanym obiekcie (chyba że można go znaleźć za pomocąfindViewById()
). Dlatego najprawdopodobniej najprawdopodobniej chciałbyś użyć tej konwencji:Aby pomóc w rozwiązaniu problemów z układem, wysoce zalecany jest Inspektor układu .
źródło
Activity
jest podklasąContext
i przykłady odpowiedzi są w zakresieActivity
, więc dla uproszczenia zastąpiłemgetBaseContext()
jethis
, ponieważ na potrzeby tej odpowiedzi jest równoważne.andig ma rację, że częstym powodem ignorowania przez LayoutInflater parametrów layout_params jest brak określenia katalogu głównego. Wiele osób uważa, że jako root można podać null. Jest to dopuszczalne w przypadku kilku scenariuszy, takich jak okno dialogowe, w którym nie masz dostępu do roota w momencie tworzenia. Jednak dobrą zasadą jest to, że jeśli masz root, przekaż go LayoutInflater.
Napisałem na ten temat szczegółowy post na blogu, który możesz sprawdzić tutaj:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
źródło
This is acceptable for a few scenarios such as a dialog
to było wszystko, czego potrzebowałemchcę dodać do głównej odpowiedzi powyżej
Próbowałem podążać za tym, ale mój recykler zaczął rozciągać każdy element na ekran,
który musiałem dodać następną linię po nadmuchaniu, aby dotrzeć do celu
Dodałem już te parametry przez xml, ale nie działały poprawnie
iz tą linią wszystko jest w porządku
źródło