W tej chwili przechowuję każdy plik układu xml w res/layout
folderze, więc zarządzanie małymi projektami jest wykonalne i proste, ale w przypadku dużych i ciężkich projektów potrzebna jest hierarchia i podfoldery potrzebne folder układu.
na przykład
layout
-- layout_personal
-- personal_detail.xml
-- personal_other.xml
--layout_address
-- address1.xml
-- address2.xml
W ten sam sposób chcielibyśmy mieć podfoldery dla dużej aplikacji, więc czy jest jakiś sposób, aby to zrobić w projekcie Android?
Jestem w stanie utworzyć podfoldery layout-personal i layout_address w folderze layoutu, ale gdy przyjdzie czas na dostęp do pliku layoutu xml przy użyciu R.layout ._______, w tym czasie nie ma wyskakującego okienka layout xml menu.
android
android-layout
Paresh Mayani
źródło
źródło
Odpowiedzi:
Możesz to zrobić z gradem. Zrobiłem projekt demonstracyjny pokazujący jak.
Sztuką jest wykorzystanie zdolności gradle do scalenia wielu folderów zasobów i ustawienia folderu res, a także zagnieżdżonych podfolderów w bloku sourceSets.
Dziwactwo polega na tym, że nie można zadeklarować folderu zasobów kontenera przed zadeklarowaniem folderów zasobów podrzędnych tego folderu.
Poniżej znajduje się blok sourceSets z pliku build.gradle z wersji demonstracyjnej. Zauważ, że podfoldery są zadeklarowane jako pierwsze.
Ponadto bezpośredni element nadrzędny twoich rzeczywistych plików zasobów (pngs, układy xml itp.) Nadal musi odpowiadać specyfikacji .
źródło
R.layout.list_item
Pochodzi z folderumovies
lubcinemas
, więc nadal obowiązuje płaska nazwa.build:gradle:0.14.4
ibuildToolsVersion "21.1.1"
.URI is not registered
problemu jest skonfigurowanie dodatkowych podfolderów „układu” .Odpowiedź brzmi nie.
Chciałbym zwrócić uwagę na tę książkę Pro Android 2, która stwierdza:
źródło
raw
zasoby, otrzymujesz zależne od gęstości / orientacji / wersji / itp. Paski, podczas gdyassets
musisz to zrobić ręcznie.Chciałem tylko dodać do fantastycznej odpowiedzi eskis dla osób mających problemy. (Uwaga: będzie to działać tylko i wyglądać jak osobne katalogi w widoku „projektu”, niestety w widoku „Androida”).
Testowane z następującymi. BuildToolsVersion = 23.0.0 stopień 1.2.3 i 1.3.0
W ten sposób zmusiłem moją do pracy z już zbudowanym projektem.
Po zakończeniu przejdź do pliku modułów gradle.build i utwórz definicję sourceSets taką jak ta ... (Upewnij się, że 'src / main / res / layouts' & 'src / main / res' zawsze znajdują się na dole dwóch !! !! Jak pokazuję poniżej).
Zysk $$$$
Ale tak na poważnie ... tak to działa. Daj mi znać, jeśli ktoś ma jakieś pytania. Mogę spróbować pomóc.
Zdjęcia są warte więcej niż słowa.
źródło
layout-v21
?'src/main/res/layouts/content'
a ścieżka tej konfiguracji to'src/main/res/layouts/content/layout'
Niemożliwe, ale folder układu jest sortowany według nazwy. Dlatego nazwy plików układu poprzedzam nazwami pakietów. Np. Dla dwóch pakietów „kupowanie” i „granie”:
źródło
Korzystam z wtyczki Android File Grouping dla Android Studio, która tak naprawdę nie pozwala na tworzenie podfolderów, ale może WYŚWIETLAĆ pliki i zasoby, ponieważ znajdują się one w różnych folderach. I właśnie tego chciałem.
Możesz zainstalować wtyczkę „Android File Grouping” przez
Windows:
Prochowiec:
W przypadku komputerów Mac mogłem to przetestować i nie byłem w stanie wyszukać wtyczki. Pobrałem wtyczkę stąd i skorzystałem z
Install plugin from disk
opcji z powyższego ustawienia.źródło
Teraz z Android Studio i Gradle, możesz mieć wiele folderów zasobów w swoim projekcie. Umożliwiając organizowanie nie tylko plików układu, ale wszelkiego rodzaju zasobów.
Nie jest to dokładnie podfolder, ale może zawierać oddzielne części aplikacji.
Konfiguracja wygląda następująco:
Sprawdź dokumentację .
źródło
clean
aby zobaczyć to odzwierciedlone w aplikacji.Myślę, że najbardziej eleganckim rozwiązaniem tego problemu (biorąc pod uwagę, że podfoldery nie są dozwolone) jest dodanie nazw plików z nazwą folderu, w którym byłby umieszczony. Na przykład, jeśli masz kilka układów dla działania, fragmentu lub po prostu ogólny widok zwany „miejscami”, powinieneś po prostu dołączyć go do nazwy „nazwa_graj_miejsce”. Przynajmniej to rozwiązuje problem organizowania ich w taki sposób, aby łatwiej je było znaleźć w IDE. To nie jest najbardziej niesamowite rozwiązanie, ale jest lepsze niż nic.
źródło
Mały problem
Jestem w stanie osiągnąć podfoldery, postępując zgodnie z najlepszą odpowiedzią na to pytanie.
Jednak w miarę powiększania się projektu będziesz mieć wiele podfolderów:
Nie jest to duży problem, ale:
app/build.gradle
za każdym razem, gdy dodajesz nowy folder.Poprawa
Napisałem więc prostą metodę Groovy, aby pobrać wszystkie zagnieżdżone foldery:
Wklej tę metodę poza
android {...}
blok w swoimapp/build.gradle
.Jak używać
W przypadku takiej struktury:
Użyj tego w ten sposób:
Jeśli masz taką strukturę:
Użyjesz go w ten sposób:
Wyjaśnienie
getLayoutList()
bierzea relative path
za argument.relative path
Jest w stosunku do katalogu głównego projektu. Więc kiedy wprowadzimy"app/src/main/res/layouts/"
, zwróci nazwę wszystkich podfolderów jako tablicę, która będzie dokładnie taka sama jak:Oto skrypt z komentarzami do zrozumienia:
Mam nadzieję, że to pomoże!
źródło
setContentView(R.layout.Admin.admin_home .)
Admin.admin_home nie został rozwiązanyR.layout.admin_home
. Skrypt powinien być w stanie automatycznie wybierać dla ciebie nazwy. Daj mi znać, czy możesz to zrobić.array.push("src/main/res");
na,def res="src/main/res";
array.push(res);
ponieważ mam błąd, ponieważ push push chce parametr Gstring nie Łańcuch jeden. Jeśli ktoś zamiast mnie znalazł ten błąd, możesz go edytować// uncomment for debugging
a następnie sprawdzić, czy wyjściasrc/main/res/layouts/<your_layout_files>
są odpowiednio wykrywane?Teraz możemy łatwo zrobić z wtyczką JetBrains o nazwie „ Grupowanie plików Androida ”
sprawdź ten link
Grupowanie plików Androida
źródło
Android Studio
Sposobem, w jaki to zrobiłem, było utworzenie osobnego folderu res na tym samym poziomie, co rzeczywisty folder res w twoim projekcie, a następnie możesz użyć tego w kompilacji aplikacji. Gradle
wtedy każdy podfolder nowego folderu res może być czymś związanym z każdym konkretnym ekranem lub czymś w twojej aplikacji, a każdy folder będzie miał swój własny
layout
/drawable
/values
etc utrzymujący porządek i nie będziesz musiał ręcznie aktualizować pliku stopni, tak jak niektóre z tych innych odpowiedzi wymagają (po prostu zsynchronizuj ocenę za każdym razem, gdy dodajesz nowy folder zasobów, aby wiedział o tym, i upewnij się, że dodałeś odpowiednie podfoldery przed dodaniem plików xml).źródło
Zaznacz skrypt Bash Spłaszcz folder, który konwertuje hierarchię folderów na pojedynczy folder
źródło
Jeśli pracujesz na systemie Linux lub Mac, obejście polega na utworzeniu podfolderów zawierających dowiązania symboliczne do plików układu. Wystarczy użyć polecenia ln z opcją -s
Problem polega na tym, że folder Layout nadal zawiera wszystkie pliki .xml. Możesz jednak wybrać je za pomocą podfolderów. To najbliższa rzecz, którą chciałbyś mieć.
Właśnie przeczytałem, że może to działać również w systemie Windows, jeśli używasz systemu Vista lub nowszego. To jest to
mklink
polecenie. Wystarczy google, sam nigdy go nie użyłem.Innym problemem jest to, że jeśli plik jest otwarty i spróbujesz go otworzyć ponownie, wtyczka zgłasza wyjątek NULL Pointer Exception. Ale się nie rozłącza.
źródło
Chociaż wszystkie propozycje dotyczące wielu zestawów zasobów mogą działać, problem polega na tym, że obecna logika wtyczki Android Studio Gradle nie zaktualizuje plików zasobów po ich zmianie na zagnieżdżone zestawy zasobów. Bieżąca implementacja próbuje sprawdzić katalogi zasobów za pomocą startWith (), więc zagnieżdżona struktura katalogów (tj. Src / main / res / layout / layouts i src / main / res / layout / layouts_category2) wybierze src / main / res / layout / layouts konsekwentnie i nigdy tak naprawdę nie aktualizuje zmian. W rezultacie musisz za każdym razem odbudować / wyczyścić projekt.
Przesłałem łatkę na https://android-review.googlesource.com/#/c/157971/, aby spróbować rozwiązać problem.
źródło
Najlepsza odpowiedź @eski jest dobra, ale kod nie jest elegancki w użyciu, więc napisałem świetny skrypt stopniowy do ogólnego użytku. Jest stosowany do wszystkich typów kompilacji i smaków produktów i nie tylko można go używać do układu, ale można również dodać podfolder dla dowolnego innego typu zasobów, np. Rysowalnego. Oto kod (umieść go w
android
bloku pliku ocen na poziomie projektu) :Jak robić w praktyce?
Na przykład, chcę utworzyć podfolder
activity
dlalayout
, dodać ciąg dowolną nazwą wresDirs
zmiennej takich jaklayouts
, to plik xml układ należy umieścić wres\layouts\activity\layout\xxx.xml
.Jeśli chcę, aby utworzyć podfolder
selectors
dladrawable
, dodać ciąg dowolną nazwą wresDirs
zmiennej takich jakdrawables
, wtedy odkształcalne plik XML należy wprowadzićres\drawables\selectors\drawable\xxx.xml
.Nazwa folderu taka jak
layouts
idrawables
jest zdefiniowana wresDirs
zmiennej, może to być dowolny ciąg. Wszystkie utworzone przez Ciebie podfoldery takie jakactivity
lubselectors
są traktowane tak samo jakres
folder. Tak więc wselectors
folderze musimydrawable
dodatkowo utworzyć folder i umieścić pliki xml wdrawable
folderze, po czym grad może rozpoznać pliki xml jako normalnie dostępne do rysowania.źródło
Jeśli użyjesz metody w zatwierdzonej odpowiedzi i chcesz ją nieco poprawić, zmień ustawienie gradacji w następujący sposób:
Więc jeśli dodasz więcej folderów i układów, nie musisz wracać tutaj i dołączać długiej listy folderów źródłowych, pozwól gradle uzyskać wszystkie foldery dla Ciebie.
źródło
źródło
Project
tryb. Nie mogłem zrozumieć, gdzie zniknęły podfoldery (wAndroid
trybie).Krótka odpowiedź brzmi „nie”. Ale na pewno możesz mieć wiele
res
folderów. Myślę, że to jest tak blisko, jak to tylko możliwe, aby mieć podfoldery dlalayout
folderu. Oto jak to robisz.źródło
Najważniejsze odpowiedzi mają kilka wad: musisz dodać nowe ścieżki układu, AS
res\layouts
zamiast tego umieszcza nowe zasoby w folderzeres\values
.Łącząc kilka odpowiedzi napisałem podobnie:
Zrobiłem foldery z tym artykułem: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Aby utworzyć podfoldery, powinieneś użyć tego menu: Nowy> Folder> Res Folder.
AKTUALIZACJA
Po kilku tygodniach zauważyłem, że Android Studio nie zauważa zmian w zasobach . Pojawiają się więc dziwne błędy. Na przykład układy nadal pokazują stare rozmiary, marginesy. Czasami AS nie znajduje nowych plików XML (szczególnie w czasie wykonywania). Czasami miesza
view id
s (odniesienia do innego pliku XML). Często trzeba nacisnąćBuild > Clean Project
lubBuild > Rebuild Project
. Przeczytaj Odbuduj wymagane po zmianie plików układu XML w Android Studio .źródło
res
folderu, ponieważ AS nie obsługuje w pełni podziału zasobów na foldery. Prawdopodobnie zmienię tę odpowiedź, a nawet usunę. Ale co masz na myśli mówiąc, że nie jest akceptowalnym sposobem dostarczania rozwiązań tutaj na SO?Nie można mieć podkatalogów (łatwo), ale możesz mieć dodatkowe foldery zasobów. Zaskoczony, nikt już o tym nie wspominał, ale aby zachować domyślne foldery zasobów i dodać jeszcze kilka:
źródło