Od kilku dni próbuję zwiększyć wydajność moich układów, konwertując z kilku poziomów zagnieżdżonych LinearLayouts
na jeden RelativeLayout
i napotkałem kilka problemów, których nie mogłem znaleźć obejścia ...
Przeszukałem grupę początkujących użytkowników Androida i tę witrynę i nie udało mi się znaleźć niczego, co pomogłoby mi rozwiązać problem.
Czytałem na jednym z blogów, że można łączyć układy ze scalaniem i dołączaniem tagów. Mam więc główny plik układu z RelativeLayout
elementem głównym. Wewnątrz tego mam 5 tagów include, które odwołują się do 5 różnych plików układu XML, z których każdy ma element scalający dla katalogu głównego (wszystkie moje pliki scalające są takie same, z wyjątkiem identyfikatorów w nich).
Mam dwa problemy, które wyjaśnię po opublikowaniu uproszczonej wersji mojego kodu układu:
Przykładowy plik układu głównego:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/translucent_gray" >
<include
android:id="@+id/running_gallery_layout_id"
layout="@layout/running_gallery_layout" />
<include
android:id="@+id/recent_gallery_layout_id"
layout="@layout/recent_gallery_layout"
android:layout_below="@id/running_gallery_layout_id" />
<include
android:id="@+id/service_gallery_layout_id"
layout="@layout/service_gallery_layout"
android:layout_below="@id/recent_gallery_layout_id" />
<include
android:id="@+id/process_gallery_layout_id"
layout="@layout/process_gallery_layout"
android:layout_below="@id/service_gallery_layout_id" />
</RelativeLayout>
Przykładowy dołączony plik scalający:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
style="@style/TitleText"
android:id="@+id/service_gallery_title_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="@string/service_title" />
<Gallery
android:id="@+id/service_gallery_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_below="@id/service_gallery_title_text_id" />
<TextView
style="@style/SubTitleText"
android:id="@+id/service_gallery_current_text_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/service_gallery_title_text_id"
android:layout_above="@id/service_gallery_id" />
</merge>
Mam dwa problemy:
1) android:layout_*
Atrybuty wydają się być ignorowane, gdy są używane w tagu włączania, a wszystkie scalone układy są wyświetlane jeden na drugim. Zgodnie z tym postem ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) „ android:layout_*
z <include />
tagiem można użyć dowolnego atrybutu ”
2) Ponieważ nie mogłem tego uruchomić, postanowiłem spróbować dodać android:layout_below
atrybut do pierwszego TextView
elementu w każdym pliku układu scalania, co oznacza, że każdy plik scalania będzie odnosił się do identyfikatora z innego pliku układu scalania ... W większości przypadków to faktycznie zadziałało, a mój układ wygląda dobrze. Jednak pojawia się błąd w jednym z android:layout_below
atrybutów, który mówi, że nie może znaleźć identyfikatora, który podałem ... Podwójnie i potrójnie sprawdziłem identyfikatory, aby upewnić się, że są poprawne. Najdziwniejsze jest to, że użyłem tej AutoFill
funkcji, aby umieścić identyfikator w atrybucie na pierwszym miejscu.
Jeśli ktoś ma jakieś sugestie lub obejścia, z przyjemnością je wypróbuję. Poza tym, jeśli ktoś może wymyślić sposób, w jaki mógłbym mieć tylko jeden plik układu scalonego XML zamiast 5, byłoby to bardzo mile widziane. Nie mogłem znaleźć sposobu, aby to zrobić, ponieważ muszę mieć dostęp do każdego elementu w plikach układu scalania w czasie wykonywania ...
layout_width
i drugie ilayout_height
ustawiłem na moim<include>
. Próbowałem też ustawićlayout_width
ilayout_height
na moim,<merge>
ale bezskutecznie. Czego mi brakuje ?Zobacz poniżej bardziej wysoko ocenioną odpowiedź. Mój jest żałośnie przestarzały
mogę rozwiązać jeden problem, który podniósł Justin : niezdolność RelativeLayout do zarządzania pozycjonowaniem dołączenia (przynajmniej w tym prostym przypadku na emulatorze 1.6)
CommonsWare sugeruje owijanie obejmuje w wyjątkowej kontenera nadrzędnego, ale czyni to w celu ułatwienia adresowania i określenie zakresu identycznie nazwanych poglądów w Justin zawiera
W rzeczywistości musisz to również zrobić , aby RelativeLayout zachowywał się zgodnie z oczekiwaniami:
To działa ( stopka jest dobrze ustawiona):
Tak nie jest ( stopka unosi się u góry ekranu):
Uwzględnienie w bosej stopce nie zostanie wyrównane do dołu elementu nadrzędnego bez otaczającego układu LinearLayout. Nie nazwałbym tego oczekiwanego zachowania.
Ponadto WebView wydaje się ładnie dołączać się do nagłówka według identyfikatora, ale uważam, że to iluzja, ponieważ po prostu płynie pod nagłówkiem pionowo. Próbowałem też ustawić przycisk tuż nad dołączeniem stopki, ale wszystko się unosiło i też było źle
RelativeLayout miał więcej problemów w 1.5, ale nadal mi się podoba :)
źródło
Człowieku, to jest stare, ale wydaje się, że pojawia się na szczycie wyszukiwań, więc zamierzam to skomentować.
Myślę, że sztuczka polega na tym, że
<merge>
tag połączony z<include>
tagiem zasadniczo usuwa jakąkolwiek „nadrzędną” grupę widoków na tym poziomie. Więc kogo dokładnie prosisz o „layout_below” kogoś innego? Nikt. Na tym poziomie nie ma widoku.<merge>
Tag przyjmuje poglądy dzieci i wyskakuje im prawo do nadrzędnego<include>
tagu. Dlatego musisz poprosić dzieci w układzie, który dołączasz, aby odpowiednio się zakotwiczyły.źródło
Aby pozycjonowanie działało na RelativeLayout, musisz ustawić parametry layout_ * w pliku dołączanym, a nie w głównym pliku układu. W ten sposób
main_layout.xml
content_layout.xml
Oczywiście nie tego chcemy my, programiści, ale jest to jedyne rozwiązanie, które znalazłem, aby uniknąć duplikowania xml
źródło
Domyślam się, że z reguł układu nie można odwoływać się do
android:id
atrybutów zdefiniowanych w<include>
elementach, a jedynie do tych, które znajdują się w „prawdziwych” widżetach i kontenerach.Proste: umieść je wszystkie w jednym pliku.
Niezależnie od tego, czy masz jeden
<include>
element, czy 1000, cała zawartość powinna być dostępna w czasie wykonywania. Jedynym wyjątkiem jest sytuacja, gdy masz zduplikowaneandroid:id
atrybuty - musisz odpowiedniofindViewById()
określić zakres wywołań, aby uzyskać właściwy, tak jak w przypadku pobierania widżetów z wiersza ListView.Jeśli możesz utworzyć przykładowy projekt, który używa 2+ plików scalania, w którym możesz wykazać, że zawartość nie jest dostępna w czasie wykonywania, daj mi znać.
źródło
próbować :
źródło
W moim przypadku układ, który próbowałem załączyć, zaczyna się od
<merge
tagu. Kiedy zmieniłem to na układ, powiedz,<RelativeLayout
że zadziałało. Poniżej znajduje się ilustracja.PRACUJĄCY
NIE DZIAŁA
źródło
Miałem ten sam problem, a nawet definiowanie
layout_width
ilayout_height
to nie działało. Problem polegał na tym, że układ, który dołączałem, miał tagi i po ich usunięciu wszystko działało jak marzenie. Przypuszczam, że scalanie nie jest tagiem układu iz tego powodu nie może odbierać parametrów pozycjonowania i rozmiaru. Ponieważ wszystko, co zdefiniujesz, jest przenoszone do wewnętrznego układu nadrzędnego, ustawienia po prostu zostały wyrzucone.TL: DR: Po prostu usuń tagi, przenieś definicje xmlns do rzeczywistego obiektu podglądu układu i powinieneś być dobry.
Przed:
Pracujący:
źródło