क्या एंड्रॉइड ड्रॉ करने योग्य निर्देशिका में उपनिर्देशिकाएं हो सकती हैं?


496

एंड्रॉइड एसडीके डॉक्यूमेंटेशन में, @ drawable / my_image xml सिंटैक्स के साथ उपयोग किए जाने वाले सभी उदाहरण सीधे उन छवियों को संबोधित करते हैं जो मेरी परियोजना में Res / drawable निर्देशिका में संग्रहीत हैं।

मुझे आश्चर्य हो रहा है कि क्या यह ड्रॉबल डायरेक्टरी के भीतर एक उप निर्देशिका बनाने के लिए स्पष्ट रूप से ठीक नहीं है।

उदाहरण के लिए, यदि मेरे पास निम्नलिखित निर्देशिका लेआउट था:

res/drawable
-- sandwiches
  -- tunaOnRye.png
  -- hamAndSwiss.png
-- drinks
  -- coldOne.png
  -- hotTea.png

क्या मैं टूना सलाद सैंडविच की छवि को @ drawable / सैंडविच / tunaOnRye के रूप में संदर्भित कर सकता हूं

या क्या मुझे पदानुक्रम निर्देशिका में पदानुक्रम फ्लैट रखना है।


16
कृपया ध्यान दें कि रेस डायरेक्टरी में कैपिटल लेटर्स की अनुमति नहीं है।
टायलर

1
आप केवल
ग्रैडल के

2
क्या यह संभव है कि खींचने योग्य कार्यक्षमता के साथ, खींचने योग्य निर्देशिकाएं हों? तो, रेस / टैंक / ड्राबल- [एचडीपीआई आदि] और इतने पर?
फेटी

जवाबों:


545

नहीं, संसाधन तंत्र ड्रॉएबल डायरेक्टरी में सबफ़ोल्डर्स का समर्थन नहीं करता है, इसलिए हाँ - आपको उस पदानुक्रम फ्लैट को रखने की आवश्यकता है।

आपके द्वारा दिखाए गए डायरेक्टरी लेआउट में कोई भी चित्र उपलब्ध नहीं होगा।

मेरे अपने प्रयोगों से ऐसा लगता है कि res/drawableफ़ोल्डर के भीतर किसी भी आइटम के साथ एक सबफ़ोल्डर होने से संसाधन संकलक विफल हो जाएगा - R.javaफ़ाइल को सही तरीके से उत्पन्न होने से रोकना ।


135
एंड्रॉइड 2.2 के रूप में, यह एक कंपाइलर त्रुटि का कारण नहीं बनता है, लेकिन आर वर्ग उत्पन्न करते समय किसी भी उपनिर्देशिका को अनदेखा किया जाता है। यह वास्तव में बेकार है, और बड़ी परियोजनाओं का प्रबंधन करना कठिन बनाता है। = /
निक रीमन

69
पूर्णतया सहमत। उन्हें उप-फ़ोल्डरों का समर्थन करने वाले एक बेहतर समाधान के साथ आने की आवश्यकता है। यह इतना कठिन नहीं हो सकता।
znq

13
उम्मीद है कि यह जल्द ही हल हो जाएगा, मुझे 100 से अधिक संपत्ति मिली हैं, और फिर भी मैंने उनमें से कुछ को कोड किया है। कुल रात घोड़ी किसी भी मामूली जटिल परियोजना का प्रबंधन करने की कोशिश कर रही है।
एमिल

14
यह Android समस्या ट्रैकर में संबंधित समस्या है: code.google.com/p/android/issues/detail?id=2018
espinchi

44
अभिशाप आप Android
व्हाइटनीलैंड

149

जो वर्कअराउंड मैं उपयोग कर रहा हूं (और एक एंड्रॉइड खुद को अनुकूल लगता है) अनिवार्य रूप से एक फॉरवर्ड स्लैश के लिए एक अंडरस्कोर का विकल्प है, इसलिए आपकी संरचना कुछ इस तरह दिखाई देगी:

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

दृष्टिकोण के लिए आपको अपने नामकरण में सावधानी बरतने की आवश्यकता होती है और इससे फाइलों को ख़ुद सुलगाना आसान नहीं होता (यदि आपने तय कर लिया कि पेय और सैंडविच वास्तव में सभी होने चाहिए " food", तो आपको बस नाम बदलने के बजाय सामूहिक नाम बदलना होगा। उन्हें निर्देशिका में ले जाना); लेकिन आपके प्रोग्रामिंग लॉजिक की जटिलता फोल्डर संरचना की तुलना में बहुत बुरी तरह से ग्रस्त नहीं है ।

यह स्थिति वास्तव में बेकार है। एंड्रॉइड अद्भुत और भयानक डिजाइन निर्णयों का एक मिश्रित बैग है। हम केवल बाद के हिस्से के लिए उम्मीद कर सकते हैं कि सभी जल्दबाजी के साथ खरपतवार निकल जाए :)


31
बस ध्यान दें कि ड्रॉएबल फ़ोल्डर में बड़े अक्षरों की अनुमति नहीं है। मुझे त्रुटि मिलती है: "अमान्य फ़ाइल नाम: में केवल [a-z0-9_] होना चाहिए"
जेसन

5
"अद्भुत और भयानक डिजाइन निर्णयों के मिश्रित बैग" के लिए +1
ब्रेंट फस्ट

1
शायद ही कोई वर्कअराउंड: बल्कि "आपको पूरी तरह से पागल न होने के लिए क्या करना चाहिए"। यह एक निर्देशिका तक सीमित रहने के लिए आकर्षक है।
रिची एचएच

35

दरअसल, एंड्रॉइड स्टूडियो पर यह संभव है। यहाँ दिखाए गए अनुसार आपके पास नेस्टेड संसाधन हो सकते हैं :

यहाँ छवि विवरण दर्ज करें

यहां समूह संसाधनों के लिए एक प्लगइन भी है


हाय, @android डेवलपर! मैंने इसे build.gradle फ़ाइल में जोड़ने का प्रयास किया है: sourceSets {main {res {srcDir 'src / main / res / drawable / ic-toggle'}}}, लेकिन मुझे xmlns के लिए "Uri पंजीकृत नहीं है" : android = " schemas.android.com/apk/res/android । क्या मामला हो सकता है?
AlexKost

@AlexKost मैंने वास्तव में केवल एक बार यह कोशिश की थी। मैं इसके साथ मदद करने के लिए पर्याप्त अनुभव नहीं कर रहा हूं। माफ़ करना।
एंड्रॉइड डेवेलपर

@RahulMandaliya भले ही यह संभव हो, मैं इसका उपयोग नहीं करने का सुझाव देता हूं।
Android डेवलपर

@androiddeveloper क्यों नहीं?
जोश हैनसेन

1
@ जोशेनसेन यह गन्दा है।
Android डेवलपर

34

हां - यह चूसना करता है :) हालांकि आप संपत्ति फ़ोल्डर का उपयोग कर सकते हैं और वहां उप निर्देशिकाएं हैं और इस तरह से छवियों को लोड कर सकते हैं।


6
समस्या केवल ड्रॉ करने योग्य फ़ोल्डर के लिए ही नहीं है, बल्कि लेआउट फ़ोल्डर के लिए भी है :( मेरे लेआउट के फ़ोल्डर में 100 से अधिक xml फाइलें हैं, और मेरे लिए इसमें सही xml लेआउट को खोलना कठिन है।
anticafe

अन्य आपत्तियों के लिए, संसाधनों को आसानी से स्थानीय किया जा सकता है लेकिन AFAIK में परिसंपत्तियों के लिए कोई अंतर्निहित अंतर्निहित तंत्र नहीं है।
मार्च को फ्रां मरोज़ा

@anticafe अपने IDE में "संसाधन पर जाएं" का उपयोग करें (ग्रहण: CTRL + SHIFT + R, IDEA / Android स्टूडियो: CTRL + SHIFT + N)
TWiStErRob

23

संपत्ति फ़ोल्डर का उपयोग करें।

नमूना कोड:

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

image = BitmapFactory.decodeStream(is);

5
इस पद्धति के साथ एकमात्र मुद्दा यह है कि बिटमैप का उपयोग करने के लिए बहुत अधिक होमवर्क शामिल है। एंड्रॉइड का रिसोर्स सिस्टम मेमोरी मैनेजमेंट का बेहतर काम करता है। जब Android पहले से ही ऐसा करता है तो आप मेमोरी मैनेजमेंट सिस्टम का पुनर्निर्माण क्यों करेंगे? निस्संदेह अगर उसके पास 100+ चित्र हैं, तो वह बहुत सारे लोडिंग और बिटमैप को जारी कर रहा है।
रेव टायलर

18
यह एक वास्तविक समस्या है कि आप अपने आवेदन को स्थानीय बनाने की योजना बना रहे हैं, भले ही आपके पास अलग-अलग स्क्रीन घनत्व के लिए अलग-अलग संसाधन हों, इसलिए यह केवल कुछ मामलों के लिए मान्य समाधान नहीं है।
फ्रेंक मारजोआ जूल

1
मुझे @Fran की टिप्पणी को कम से कम एक हजार अपवित्र देने की आवश्यकता है :)
HGPB

22

मैंने एक ग्रहण प्लगइन लिखा है जो दो अंडरस्कोर के साथ फ़ाइल नाम को अलग करके वर्चुअल सबफ़ोल्डर बनाने की अनुमति देता है __। यह परियोजना अभी शुरुआती चरण में है, लेकिन चिंता न करें कि यह आपके आईडीई को दुर्घटनाग्रस्त नहीं करेगी

अधिक जानकारी यहां मिल सकती है, बेझिझक फोर्क करें और पुल अनुरोध भेजें:

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

यहाँ छवि विवरण दर्ज करें


2
अच्छा! एंड्रॉइड स्टूडियो में भी इसे पोर्ट करने का कोई मौका?
बीवी

1
मैं वर्तमान में एंड्रॉइड स्टूडियो का उपयोग नहीं कर रहा हूं, इसलिए मुझे लगता है, हमें इसे पोर्ट करने के लिए कुछ अनुभवी का इंतजार करना होगा।
किरिल कुलकोव

9

मैं एक सरल स्क्रिप्ट का उपयोग करना चाहता हूं ताकि डिजाइनरों द्वारा प्रदान की गई एक संगठित निर्देशिका संरचना को समतल किया जा सके, जिसका उपयोग आर फाइल बनाने के लिए किया जा सकता है।

ड्रा करने योग्य-एचडीपीआई में वर्तमान पथ के साथ चलाएं:

#! /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

1
यदि आपकी फ़ोल्डर के नीचे उप फ़ोल्डर है तो आपकी स्क्रिप्ट काम नहीं करेगी। मुझे लगता है कि आपको $ {dir} में सभी '/' को '_' से बदलना होगा।
Seunghoon

9

एंड्रॉइड स्टूडियो में ग्रेडेल के साथ आपके पास कई स्रोत निर्देशक हो सकते हैं जो आपको अलग-अलग संसाधनों की अनुमति देगा। उदाहरण के लिए:

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

हालाँकि नाम टकराने नहीं चाहिए, जिसका अर्थ है कि आपको अभी भी सैंडविचेज़_टूनाऑनआर जैसे नामों की आवश्यकता होगी, लेकिन आप अपने सभी सैंडविचों के लिए एक अलग अनुभाग रख पाएंगे।

यह आपको अपने संसाधनों को विभिन्न संरचनाओं में संग्रहीत करने की अनुमति देता है (स्वतः उत्पन्न सामग्री के लिए उपयोगी जैसे एक्शनबारगनेटर)


4

आंशिक रूप से समस्या के आसपास पहुंचने का एक तरीका एपीआई स्तर प्रत्यय का उपयोग करना है। मैं एक ही एपीके में कई उप परियोजनाओं को रखने के लिए रेस / लेआउट-v1, रेस / लेआउट-वी 2 आदि का उपयोग करता हूं। इस तंत्र का उपयोग सभी संसाधन प्रकारों के लिए किया जा सकता है।

जाहिर है, इसका उपयोग केवल तभी किया जा सकता है, जब आप रेस स्तर को लेआउट / लेआउट-वी के ऊपर लक्षित कर रहे हों? आप उपयोग कर रहे हैं।

इसके अलावा, एंड्रॉइड 1.5 और 1.6 में बग के लिए देखें। एपीआई स्तर प्रत्यय के बारे में एंडोरायड प्रलेखन देखें


जिसने भी इस उत्तर को डाउनग्रेड किया है: क्या आप बता सकते हैं कि क्यों? यह तंत्र, हालांकि सुंदर नहीं है, मेरे लिए अच्छा काम करता है।
OferR

4

पुस्तकालय प्रणाली के आगमन के साथ, संपत्ति के बड़े सेट के अनुसार एक पुस्तकालय बनाना एक समाधान हो सकता है।

यह अभी भी समस्याग्रस्त है क्योंकि सभी संपत्तियों के भीतर एक ही नाम का उपयोग करने से बचना चाहिए लेकिन प्रति पुस्तकालय में एक उपसर्ग योजना का उपयोग करना चाहिए।

यह फ़ोल्डर्स बनाने में सक्षम होने के रूप में सरल नहीं है, लेकिन यह चीजें रखने में मदद करता है ...


हां, मुझे लगता है कि यह अच्छा है। अगर मैं अपने ड्रिबल-एलडीपीआई आदि फ़ोल्डरों में देश के झंडे जोड़ता हूं, तो वे स्वाइप हो जाएंगे। मुझे लगता है कि सभी सामान्य संसाधनों के लिए एक पुस्तकालय परियोजना बनाने से उस परियोजना में अव्यवस्था को कम करने में मदद मिलेगी, जिस पर आप सक्रिय रूप से काम कर रहे हैं। हैरानी आपको केवल 1 अपवोट है।
टॉम

3

इस स्थिति के लिए एक वर्कअराउंड है: आप एक resVector(उदाहरण के लिए) फ़ोल्डर को डिफ़ॉल्ट resफ़ोल्डर के समान स्तर पर बना सकते हैं । वहां आप कोई भी drawable-xxxसंसाधन फ़ोल्डर जोड़ सकते हैं :

resVector
-drawable
-layout
-color

उसके बाद आपको बस जरूरत है जोड़ने की

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

आपकी build.gradleफ़ाइल में (अंदर android { })।


अफसोस की बात है कि वे "एंड्रॉइड" परिप्रेक्ष्य का उपयोग करते समय एंड्रॉइड स्टूडियो में प्रोजेक्ट पैनल में एक साथ विलय कर रहे हैं :(
AjahnCharles

@AjahnCharles - मैं इस परिप्रेक्ष्य का उपयोग बिल्कुल भी नहीं करना पसंद करता हूं (वैसे भी - मैं हमेशा 'डिस्ट्रेस फ्री मोड' पर काम कर रहा हूं) ... लेकिन आप सही हैं - "एंड्रॉइड" सब कुछ मर्ज कर देता है।
एंटोन डेरेविन्को

1

यह सही तरीके नहीं है। आपको वही तरीका लागू करना होगा जो यहां प्रदर्शित है

आप जिस कोड का उपयोग कर सकते हैं उसके माध्यम से फ़ोल्डर के तहत छवि को भी कॉल कर सकते हैं

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

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);

1

मेरा नहीं, लेकिन मैंने इस मुद्दे को ढूंढते समय इस धागे को ढूंढा, अगर आपका एंड्रॉइड स्टूडियो और ग्रैडल बिल्ड सिस्टम का उपयोग कर इसकी बहुत आसान कोई प्लगइन्स आवश्यक नहीं है, तो बस थोड़ा सा निर्माण फ़ाइल संपादन

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


1

एंड्रॉइड स्टूडियो के साथ ग्रैडल इसे इस तरह से कर सकता है ( लिंक )।

यह "संरचना का विन्यास" अनुच्छेद में है

sourceSets {
 main {
    java {
        srcDir 'src/java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}

1

मुख्य में एक फ़ोल्डर बनाएँ। जैसे: 'res_notification_btn'

और 'ड्रॉबल' या 'लेआउट' की तरह ट्री फोल्डर बनाएं

फिर 'build.gradle' में इसे जोड़ें

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }

0
#!/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?("/")
}

यह सब Cheezmeister द्वारा सुझाए गए समाधान को स्वचालित करता है। यह मेरे लिए काम कर रहा है ... नीचे की व्याख्या करने के लिए देखभाल?
ब्लेक मिलर


0

संपत्ति / आप इसका उपयोग कच्ची संपत्ति फ़ाइलों को संग्रहीत करने के लिए कर सकते हैं। आपके द्वारा यहां सेव की जाने वाली फाइलें एक .apk फाइल के रूप में संकलित की जाती हैं, और मूल फ़ाइल नाम को संरक्षित किया जाता है। आप इस निर्देशिका को उसी तरह से नेविगेट कर सकते हैं जैसे कि यूआरआई का उपयोग कर एक विशिष्ट फाइल सिस्टम और फाइल को असेंबलीजर का उपयोग करके बाइट्स की एक धारा के रूप में पढ़ा जाता है। उदाहरण के लिए, यह बनावट और गेम डेटा के लिए एक अच्छा स्थान है। http://developer.android.com/tools/projects/index.html


0

उपनिर्देशिका की अनुमति नहीं है, संसाधन में केवल [a-z0-9_] होना चाहिए।

न आपके पास अपरकेस अक्षर हैं, और न ही कोई आगे की स्लैश।


-3
  1. ड्रा करने योग्य पर राइट क्लिक करें
  2. नई ---> निर्देशिका का चयन करें
  3. निर्देशिका नाम दर्ज करें। जैसे: logo.png (स्थान पहले से ही डिफ़ॉल्ट रूप से ड्रा करने योग्य फ़ोल्डर दिखाएगा)
  4. ड्रा करने योग्य फ़ोल्डर में सीधे छवियों को कॉपी और पेस्ट करें। पेस्ट करते समय आपको सूची में से प्रत्येक चित्र के लिए mdpi / xhdpi / xxhdpi आदि चुनने का विकल्प मिलता है। उपयुक्त विकल्प का चयन करें और छवि का नाम दर्ज करें। निर्देशिका नाम यानी logo.png के समान नाम रखना सुनिश्चित करें
  5. शेष चित्रों के लिए भी यही करें। उन सभी को logo.png मुख्य फ़ोल्डर के तहत रखा जाएगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.