Czy katalog drawable Android może zawierać podkatalogi?

W dokumentacji Android SDK wszystkie przykłady używane ze składnią xml @drawable / my_image bezpośrednio adresują obrazy, które są przechowywane w katalogu res / drawable w moim projekcie.

Zastanawiam się, czy nie jest w porządku tworzyć podkatalog w katalogu drawable.

Na przykład, gdybym miał następujący układ katalogów:

res/drawable
-- sandwiches
  -- tunaOnRye.png
  -- hamAndSwiss.png
-- drinks
  -- coldOne.png
  -- hotTea.png
[[1]}Czy mógłbym odwołać się do obrazu kanapki z sałatką z tuńczyka jako @drawable / sandwiches / tunaOnRye

Czy mam aby hierarchia była płaska w katalogu drawable.

Author: user2864740, 2009-07-03

19 answers

Nie, Mechanizm zasobów nie obsługuje podfolderów w katalogu drawable, więc tak - musisz zachować tę hierarchię płaską.

Pokazany układ katalogów spowoduje, że żaden z obrazów nie będzie dostępny.

Z moich własnych eksperymentów wydaje się, że posiadanie podfolderu z dowolnymi elementami w nim, w folderze res/drawable, spowoduje awarię kompilatora zasobów - zapobiegając poprawnemu wygenerowaniu pliku R.java.

 484
Author: Reto Meier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-03 11:37:26

Obejście, którego używam (a sam Android wydaje się faworyzować), polega na zastąpieniu podkreślenia ukośnikiem do przodu, więc twoja struktura wyglądałaby mniej więcej tak: {]}

sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png

Podejście wymaga skrupulatnego nazewnictwa i nie ułatwia wranglowania samych plików( jeśli zdecydowałeś, że napoje i kanapki naprawdę powinny być " food", musisz zrobić masową zmianę nazwy, a nie po prostu przenieść je do katalogu); ale twój złożoność logiki programowania nie cierpi zbyt źle w porównaniu do odpowiednika struktury folderów.

Ta sytuacja jest do bani. Android to mieszana torba wspaniałych i strasznych decyzji projektowych. Możemy tylko mieć nadzieję, że ta ostatnia część zostanie usunięta z całym należnym pośpiechem:)
 142
Author: Cheezmeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 17:57:18

Tak - jest do bani :) jednak możesz użyć folderu assets i mieć tam podkatalogi i w ten sposób ładować obrazy.

 31
Author: dijipiji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-07 09:37:31

Właściwie, na Android Studio jest to możliwe. Możesz mieć zagnieżdżone zasoby, jak pokazano Proszę. :

Tutaj wpisz opis obrazka

Istnieje również plugin do grupowania zasobów Proszę..

 28
Author: android developer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 10:45:15

Użyj folderu zasoby.

Przykładowy kod:

InputStream is = null;
try {
    is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
    ;
}

image = BitmapFactory.decodeStream(is);
 22
Author: milkia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-12 12:38:48

Napisałem wtyczkę eclipse, która umożliwia tworzenie wirtualnego podfolderu poprzez oddzielenie nazwy pliku dwoma podkreślnikami __. Projekt jest w początkowej fazie, ale nie martw się, że nie zawiedzie twojego IDE

Więcej szczegółów można znaleźć tutaj, zachęcamy do rozwidlenia i wysłania żądań ciągnięcia:

Https://github.com/kirill578/Android-Sorted-Res-Folder

Tutaj wpisz opis obrazka

 20
Author: Kirill Kulakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-03 15:29:07

Lubię używać prostego skryptu do spłaszczania zorganizowanej struktury katalogów dostarczonej przez projektantów do czegoś, co może być użyte do wygenerowania pliku R.

Uruchom z bieżącą ścieżką w drawable-hdpi:

#! /bin/bash
DIRS=`find * -type d`
for dir in ${DIRS} ; do 
  for file in `ls ${dir}` ; do
    mv ${dir}/${file}  ${dir}_${file};
  done 
  rmdir ${dir};
done
 9
Author: Rene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 10:54:53

W android studio z gradle możesz mieć wiele dyrektorów źródłowych, co pozwoli Ci na oddzielenie zasobów. Na przykład:

android {
    ....
    android.sourceSets {
        main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
    }
    ....
}

Jednak nazwy nie mogą się ze sobą kolidować, co oznacza, że nadal będziesz musiał mieć nazwy takie jak sandwiches_tunaOnRye, ale będziesz mógł mieć oddzielną sekcję dla wszystkich Twoich kanapek.

To pozwala na przechowywanie zasobów w różnych strukturach (przydatne dla automatycznie generowanych treści, takich jak actionbargenerator)

 9
Author: Alec Holmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 08:54:22

Jednym ze sposobów na częściowe obejście problemu jest użycie sufiksu poziomu API. Używam res / layout-v1, res/layout-V2 itp do przechowywania wielu projektów podrzędnych w tym samym apk. Mechanizm ten może być stosowany dla wszystkich typów zasobów.

Oczywiście może to być użyte tylko wtedy, gdy kierujesz API na poziomy powyżej res/layout-v? bierzesz.

Uważaj również na błąd w Androidzie 1.5 i 1.6. zobacz dokumentację Andoroid dotyczącą sufiksu poziomu API .

 4
Author: OferR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 09:31:54

Wraz z pojawieniem się systemu bibliotecznego, tworzenie biblioteki na duży zestaw zasobów może być rozwiązaniem.

Jest to nadal problematyczne, ponieważ należy unikać używania tych samych nazw we wszystkich zasobach, ale użycie schematu prefiksu dla każdej biblioteki powinno w tym pomóc.

Nie jest to tak proste, jak możliwość tworzenia folderów, ale pomaga to zachować zdrowy rozsądek...

 2
Author: shi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-20 01:42:15

Istnieje obejście tej sytuacji: możesz utworzyć resVector (na przykład) folder na tym samym poziomie, co domyślny folder res. Tam możesz dodać dowolny drawable-xxx katalog zasobów:

resVector
-drawable
-layout
-color

Potem wystarczy dodać

sourceSets {
        main.res.srcDirs += 'src/main/resVector'
    }

Do pliku build.gradle (wewnątrz android { }).

 2
Author: Anton Derevyanko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 12:08:15

To nie są doskonałe metody. Musisz zaimplementować ten sam sposób, który jest wyświetlany tutaj .

Możesz również wywołać obraz pod folderem za pomocą kodu, którego możesz użyć

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
 1
Author: user3177928,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 14:39:45

Nie mój, ale znalazłem ten wątek, gdy szukasz tego problemu, jeśli używasz Android Studio i Gradle Build system jego dość łatwe bez wtyczek konieczne tylko trochę edycji pliku kompilacji

Https://stackoverflow.com/a/22426467/618419

 1
Author: Captnwalker1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:38

Gradle z Android Studio może to zrobić w ten sposób (link).

Jest w akapicie "konfigurowanie struktury"

sourceSets {
 main {
    java {
        srcDir 'src/java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}
 1
Author: user3290180,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 07:46:51

Utwórz folder w main. like: "res_notification_btn"

I utwórz folder drzewa w. jak 'drawable ' lub'layout'

Następnie w ' build.gradle ' add this

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }
 1
Author: Ali Bagheri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 06:43:12
#!/usr/bin/env ruby

# current dir should be drawable-hdpi/ etc

# nuke all symlinks
Dir.foreach('.') {|f|
    File.delete(f) if File.symlink?(f)
}

# symlink all resources renaming with underscores
Dir.glob("**/*.png") {|f|
    system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/")
}
 0
Author: Blake Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-29 17:59:02

Sprawdź skrypt Bash Flatten Folder który konwertuje hierarchię folderów do jednego folderu

 0
Author: Sneg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 08:32:23

Aktywa/ Można go używać do przechowywania plików surowych zasobów. Pliki, które tutaj zapisujesz są kompilowane doplik apk w stanie niezmienionym, a Oryginalna nazwa pliku jest zachowana. Możesz poruszać się po tym katalogu w taki sam sposób jak typowy system plików używając Uri i odczytywać pliki jako strumień bajtów za pomocą AssetManager. Na przykład jest to dobra lokalizacja dla tekstur i danych gry. http://developer.android.com/tools/projects/index.html

 0
Author: Alex M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-01 17:24:47

Podkatalogi nie są dozwolone, zasób musi zawierać tylko [a-z0-9_.].

Nie masz wielkich liter i żadnych ukośników.

 0
Author: Ferhat Aslan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-13 14:38:46