2012-10-09 10 views
7

Chciałbym dowiedzieć się, jak ponownie użyć lub "alias" układów z najmniejszą liczbą kodów.Nieprawidłowa dokumentacja systemu Android dotycząca aliasów układu?

Wydaje się, że Android documentation about layout aliases jest błędna, a na pewno pojawi się niespójne. Ta część dokumentacji przedstawia poniższy plik układu jako przykład:

<resources> 
    <item name="main" type="layout">@layout/main_twopanes</item> 
</resources> 

Gdy próbuję skompilować ten, pojawia się błąd Attribute is missing the Android namespace prefix. Nawet po dodaniu nazw do elementu resources, mam error: Error: String types not allowed (at 'type' with value 'layout').

Elsewhere in the Android documentation, pokazują inną i pozornie odwrócony i nieprawidłowy sposób do układów Alias:

Aby utworzyć alias do istniejącego układu, użyj element, zawinięty w <merge>. Na przykład:

<?xml version="1.0" encoding="utf-8"?> 
<merge> 
    <include layout="@layout/main_ltr"/> 
</merge> 

Running skutkuje następującym błędem w LogCat E/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true. Tak więc ten błąd zdaje się wzmacniać fakt, że ta para musi być błędem, ponieważ wymaga niepotrzebnego rodzica .

Wreszcie jest <merge> documentation, który wydaje się być sprzeczny z poprzednim kierunkiem, nie wspominając o odwróconej formie najwyższego poziomu <merge><include/></merge>.

Aby zapobiec tym taki redundantne grupy widoku, można zamiast tego użyć elemencie w widoku głównym na układ wielokrotnego użytku. Dla przykład:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/add"/> 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/delete"/> 

</merge> 
+1

Sieć [Pierwsza metoda] (http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters) wydaje się skompilować i działa dobrze dla mnie. Czy masz zainstalowane najnowsze narzędzia SDK? – Joe

+0

@Joy dziękuję za zweryfikowanie tego! W końcu nie przeczytałem dokładnie instrukcji. Zrobiłem to, co myślałem, że powinienem zrobić - umieść plik layout.xml w folderze 'layout-large', a nie' values-large'. –

Odpowiedz

7

Pierwsza technika działa, wystarczy umieścić plik <resources> w odpowiednim folderze. Powinien znajdować się w folderach values, a nie folderach layout, jak w przypadku ponownego wykorzystywania układów za pośrednictwem <include>.

Załóżmy na przykład, że masz układ o nazwie editor.xml, który znajduje się w folderze layout. Załóżmy, że chcesz użyć specjalnego układu na ekranach o rozmiarach small i normal. Jeśli nie chcesz się powtarzać, wystarczy skopiować i wkleić ten układ do folderów layout-small i layout-normal i nadać im nazwę editor.xml w każdym folderze. Więc masz trzy pliki o nazwie editor.xml.

Jeśli nie chcesz się powtarzać, umieścisz specjalny układ w głównym folderze layout i nadasz mu nazwę, powiedzmy, compact_editor.xml. Następnie należy utworzyć plik o nazwie layout.xml w folderach values-small i values-normal. Każdy plik będzie czytać:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <item name="editor" type="layout">@layout/compact_editor</item> 
</resources> 

mam złożyła documentation issue o dwóch innych problemów.

+1

"to odwrócone użycie scalania wydaje się być nieudokumentowane w inny sposób" - powód, dla którego '' jest potrzebny, '' 'nie jest obsługiwany jako element główny, z jakiegoś powodu. W przeciwnym razie użycie "" jest normalne. '' mówi 'tutaj jest kilka widżetów i kontenerów, które muszą przejść w jakiś nieokreślony rodzic ", z' 'służącym jako główny element XML (ponieważ XML potrzebuje jednego). W tym przypadku "pęczek widżetów i kontenerów" jest przechowywany w innym zasobniku układu, stąd "". – CommonsWare

+0

@CommonsWare Brzmi rozsądnie, ale to twoja interpretacja oparta na zrozumieniu '' nie jest jego [aktualna dokumentacja] (http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge) . –

+0

Cóż, rzeczywista dokumentacja nie ma zamiaru wygrać nagrody, ale nie ma tam nic, co byłoby sprzeczne z tym, co napisałem. – CommonsWare

Powiązane problemy