क्या Android लेआउट फ़ोल्डर में सबफ़ोल्डर हो सकते हैं?


551

अभी, मैं हर xml लेआउट फ़ाइल को res/layoutफ़ोल्डर के अंदर संग्रहीत कर रहा हूं , इसलिए यह छोटी परियोजनाओं को प्रबंधित करने के लिए संभव और सरल है, लेकिन जब बड़ी और भारी परियोजनाओं का मामला होता है, तो अंदर एक पदानुक्रम और उप-फ़ोल्डर होना चाहिए लेआउट फ़ोल्डर।

उदाहरण के लिए

layout
-- layout_personal
   -- personal_detail.xml
   -- personal_other.xml
--layout_address
  -- address1.xml
  -- address2.xml

उसी तरह, हम बड़े एप्लिकेशन के लिए सब-फ़ोल्डर्स रखना चाहेंगे, तो क्या एंड्रॉइड प्रोजेक्ट के अंदर ऐसा करने का कोई तरीका है?

मैं लेआउट फ़ोल्डर के अंदर लेआउट-व्यक्तिगत और लेआउट_ड्रेस्रेस उप-फ़ोल्डर बनाने में सक्षम हूं, लेकिन जब आर.लीटआउट ._______ का उपयोग करके xml लेआउट फ़ाइल तक पहुंचने का समय आता है, तो उस समय कोई भी xml लेआउट पॉप-अप अंदर नहीं होता है। मेन्यू।



मुझे लगता है कि यह लिंक आपको विस्तार से मदद कर सकता है। blog.mindorks.com/…
दिलीप पौडेल

जवाबों:


475

आप इसे ढाल के साथ कर सकते हैं। मैंने एक डेमो प्रोजेक्ट दिखाया है कि कैसे।

चाल कई संसाधन फ़ोल्डरों को मर्ज करने के लिए ग्रेड की क्षमता का उपयोग करने के लिए है , और रेस फ़ोल्डर के साथ-साथ सोर्ससेट ब्लॉक में नेस्टेड सबफ़ोल्डर्स को सेट करने के लिए है।

क्विकर यह है कि आप उस फ़ोल्डर के चाइल्ड रिसोर्स फ़ोल्डर की घोषणा करने से पहले कंटेनर रिसोर्स फ़ोल्डर की घोषणा नहीं कर सकते।

नीचे डेमो से build.gradle फ़ाइल से sourceSets ब्लॉक है। ध्यान दें कि सबफ़ोल्डर पहले घोषित किए जाते हैं।

sourceSets {
    main {
        res.srcDirs =
        [
                'src/main/res/layouts/layouts_category2',
                'src/main/res/layouts',
                'src/main/res'
        ]
    }
}

नेस्टेड संसाधन चित्र

इसके अलावा, आपकी वास्तविक संसाधन फ़ाइलों का प्रत्यक्ष अभिभावक (pngs, xml layouts, आदि ..) को अभी भी विनिर्देश के अनुरूप होने की आवश्यकता है ।


6
क्या यह संभव करने योग्य फ़ोल्डर्स के साथ ऐसा करना संभव है? मैंने सिर्फ बिना किसी भाग्य के प्रयास किया, यहां तक ​​कि घोषणा के आदेश को भी ध्यान में रखते हुए।
ट्रेवर-ए

7
अच्छा! बस याद रखें कि आप वास्तव में संसाधन फ़ोल्डरों को मर्ज करने की ग्रेडेल की क्षमता का केवल शोषण कर रहे हैं और यह समझ में आएगा।
एसके

5
फ़ोल्डर में फ़ाइल नाम अभी भी अद्वितीय होना चाहिए और कोड में आपको यह जानना होगा कि उदा या फ़ोल्डर R.layout.list_itemसे आ रहा है , इसलिए फ्लैट नामकरण अभी भी लागू होता है। moviescinemas
ट्वीस्ट्रीमोब

5
दुर्भाग्य से यह मेरे साथ काम नहीं करता है build:gradle:0.14.4और buildToolsVersion "21.1.1"
कामिल लेलोनेक

32
यह काम करता है, फिर भी इस सवाल का जवाब एक करता बुरी तरह समझा है कि एक के लिए प्रत्येक उप-फ़ोल्डर है कि आप की जरूरत को जोड़ने की अपर्याप्त काम दूसरा यह की सबफ़ोल्डर के अंदर है, जो केवल "लेआउट" कहा जा सकता है, और अपने लेआउट फ़ाइलों के सभी के अंदर जाने की जरूरत है दूसरा सबफ़ोल्डर (s)। काम करने के लिए दर्जनों टिप्पणियों के माध्यम से पढ़ना जो आदर्श से बहुत दूर है। और अभी भी देख रहे किसी के लिए, अतिरिक्त "लेआउट" सबफ़ोल्डर्स स्थापित करना URI is not registeredसमस्या का समाधान है।
एरोथ

233

जवाब न है।

मैं इस पुस्तक प्रो Android 2 की ओर आपका ध्यान आकर्षित करना चाहूंगा जिसमें कहा गया है:

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

दूसरा, रेस के तहत संपत्ति फ़ोल्डर और कच्चे फ़ोल्डर के बीच कुछ समानताएं हैं। दोनों फ़ोल्डरों में कच्ची फाइलें हो सकती हैं, लेकिन कच्चे के भीतर की फाइलों को संसाधन माना जाता है और संपत्ति के भीतर की फाइलें नहीं होती हैं।

ध्यान दें कि क्योंकि संपत्ति फ़ोल्डर की सामग्री को संसाधन नहीं माना जाता है, आप इसके भीतर फ़ोल्डर और फ़ाइलों की एक मनमानी पदानुक्रम डाल सकते हैं ।


3
मुझे लगता है कि हमारी अगली सबसे अच्छी आशा एक ग्रहण या IntelliJ प्लगइन होगी जो फ़ाइल नाम उपसर्गों के आधार पर फ़ाइलों को ध्वस्त कर सकती है।
जेरी ब्रैडी

15
@Justin ने हल के लिए मेरे द्वारा पोस्ट किए गए समाधान की जांच की।
१५:१४

मुझे लगता है कि एक समाधान फ़ाइलों को नाम देने के लिए हो सकता है जैसा कि आप उन्हें वर्गीकृत करेंगे, इसलिए ऐसा लगता है कि यह सबफ़ोल्डर्स में है। मैं नाम की शुरुआत में एक "सबफ़ोल्डर टैग" जोड़ता हूं। उदाहरण के लिए। सभी गतिविधियाँ "activity_activityname.xml" होंगी और एक बच्चे की गतिविधि "activity_activityname_childactivity.xml" इत्यादि हो सकती है। कोई अन्य फ़ाइल "other_filename.xml" होगी। यही मैं भ्रम से बचने के लिए करता हूं। धिक्कार है, किसी ने मुझे पीटा। तीन साल तक> <मेरा बुरा, ऐसा नहीं देखा था।
वेदव्यास भट्ट

1
यहां यह नोट करना महत्वपूर्ण है कि rawसंसाधनों के रूप में विचार करके आपको घनत्व / अभिविन्यास / संस्करण / आदि पर निर्भर स्ट्रिपिंग मिलती है, जबकि assetsआपको मैन्युअल रूप से ऐसा करना होगा।
ट्वीस्ट्रीमोब

1
इस उत्तर को Android मुख्यधारा को समझने के विरुद्ध एक तर्क के रूप में चुना।
ज़ोन

77

मैं सिर्फ मुसीबत में लोगों के लिए eskis के शानदार जवाब को जोड़ना चाहता था। (नोट: यह केवल 'प्रोजेक्ट' दृश्य के अंदर अलग-अलग निर्देशिकाओं की तरह काम करेगा और दुर्भाग्य से 'android' दृश्य नहीं होगा)

निम्नलिखित के साथ परीक्षण किया गया। BuildToolsVersion = 23.0.0 प्रवण 1.2.3 और 1.3.0

यह है कि मुझे पहले से निर्मित परियोजना के साथ काम करने के लिए मेरा कैसे मिला।

  1. सभी XML फ़ाइलों को अपने लेआउट निर्देशिका से बाहर कॉपी करें, और उन्हें डेस्कटॉप पर एक निर्देशिका में डालें या बैकअप के लिए कुछ करें।
  2. संपूर्ण लेआउट निर्देशिका को हटाएं (सुनिश्चित करें कि आपने चरण 1 से सब कुछ बैकअप लिया है !!!
  3. Res निर्देशिका पर राइट क्लिक करें और नई> निर्देशिका का चयन करें।
  4. इस नई निर्देशिका को "लेआउट" नाम दें। (यह आप जो चाहें कर सकते हैं, लेकिन यह 'खंड' निर्देशिका या 'गतिविधि' निर्देशिका नहीं होगी, जो बाद में आती है)।
  5. नई "लेआउट" निर्देशिका पर राइट-क्लिक करें और नई> निर्देशिका का चयन करें। (यह उस प्रकार की XML फ़ाइलों का नाम होगा, जो आपके पास होंगी, उदाहरण के लिए, 'टुकड़े' और 'गतिविधियाँ')।
  6. 'टुकड़ा' या 'गतिविधियाँ' निर्देशिका पर राइट क्लिक करें (ध्यान दें: इसके लिए 'टुकड़ा' या 'गतिविधियाँ' होना ज़रूरी नहीं है, उदाहरण के तौर पर मैं इसका उपयोग कर रहा हूँ) और एक बार फिर नई> निर्देशिका का चयन करें और इस निर्देशिका को नाम दें "लेआउट"। (नोट: इस MUST को 'लेआउट' नाम दिया जाना चाहिए !!! बहुत महत्वपूर्ण है)।
  7. XML फ़ाइलें आप अपने डेस्कटॉप पर किए गए बैकअप से नई 'लेआउट' निर्देशिका के अंदर रखना चाहते हैं।
  8. अपनी इच्छानुसार कई कस्टम निर्देशिकाओं के लिए चरण 5 - 7 को दोहराएं।
  9. एक बार जब यह पूरा हो जाए, तो अपने मॉड्यूल gradle.build फ़ाइल में जाएं और इस तरह एक sourceSets परिभाषा बनाएं ... (सुनिश्चित करें कि 'src / main / res / लेआउट' और 'src / main / res' हमेशा नीचे दो होते हैं !! !! जैसे मैं नीचे दिखा रहा हूं)।

    sourceSets {
        main {
            res.srcDirs =
                    [
                            'src/main/res/layouts/activities',
                            'src/main/res/layouts/fragments',
                            'src/main/res/layouts/content',
                            'src/main/res/layouts',
                            'src/main/res'
                    ]
        }
    }
  10. लाभ $ $ $ $ $

लेकिन गंभीरता से .. यह मुझे काम करने के लिए मिला है। मुझे पता है अगर किसी को कोई सवाल है .. मैं मदद करने की कोशिश कर सकते हैं।

चित्र शब्दों से अधिक मूल्य के हैं।

निर्देशिका संरचना


1
लेआउट निर्देशिकाओं के बारे में क्या layout-v21?
अक्षय चोरिया

4
मैंने इसका परीक्षण नहीं किया है, लेकिन मैं आपको केवल लेआउट फ़ोल्डर के साथ एक लेआउट-वी 21 फ़ोल्डर बनाने की कल्पना करूंगा।
hitch.united

ढाल 2.0.0 और buildToolsVersion 23.0.2 पर काम करता है! ध्यान दें कि विन्यास मान है 'src/main/res/layouts/content'और इस विन्यास का मार्ग है'src/main/res/layouts/content/layout'
cwhsu


2
थोड़ी देर तक बिना किसी भाग्य के खोजा, यह एकमात्र उपाय है जो मेरे लिए काम करता है। छवियों के साथ इस तरह के एक विस्तृत जवाब पोस्ट करने के लिए धन्यवाद!
मशीन ट्राइब

52

संभव नहीं है, लेकिन लेआउट फ़ोल्डर को नाम से क्रमबद्ध किया गया है। इसलिए, मैं अपने पैकेज नामों के साथ लेआउट फ़ाइल नामों को प्रस्तुत करता हूं। जैसे दो पैकेज "खरीदना" और "खेलना":

buying_bought_tracks.xml
buying_buy_tracks.xml
playing_edit_playlist.xml
playing_play_playlist.xml
playing_show_playlists.xml

20

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

आप "Android फ़ाइल ग्रुपिंग" प्लगइन द्वारा स्थापित कर सकते हैं

खिड़कियाँ:

Android Studio -> फ़ाइल -> सेटिंग्स -> प्लगइन्स।

मैक:

Android Studio -> Android Studio Tab (ऊपरी बाएँ) -> प्राथमिकताएँ -> प्लगइन्स -> JetBrains प्लगइन स्थापित करें ..

मैक के लिए, मैं इसका परीक्षण करने में सक्षम था और प्लगइन की खोज करने में सक्षम नहीं था। इसलिए मैंने यहां से प्लगइन डाउनलोड किया और Install plugin from diskउपरोक्त सेटिंग से विकल्प का उपयोग किया ।


उस प्लगइन का लिंक भी शेयर करें!
परेश मेयानी

किया हुआ। वैसे भी आप हमेशा एंड्रॉइड स्टूडियो में "एंड्रॉइड फाइल ग्रुपिंग" के लिए खोज कर सकते हैं -> फाइल -> सेटिंग्स -> प्लगइन्स
शार्प

3
प्लगइन "एंड्रॉइड" दृश्य पर काम नहीं करता था, केवल "प्रोजेक्ट" दृश्य: /
ह्यूगो ग्रेशे

18

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

यह बिल्कुल उप-फ़ोल्डर नहीं है, लेकिन आपके आवेदन के कुछ हिस्सों को अलग कर सकता है।

कॉन्फ़िगरेशन इस प्रकार है:

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

प्रलेखन की जाँच करें ।


2
मैंने देखा कि हर बार जब मैंने इस सेटिंग के तहत एक लेआउट में बदलाव किया, तो मुझे हमेशा cleanइसे ऐप पर प्रतिबिंबित करने के लिए एक करना था ।
पवन कुमार

16

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


16

छोटी सी समस्या

मैं इस प्रश्न के शीर्ष उत्तर का पालन ​​करके सबफ़ोल्डर्स प्राप्त करने में सक्षम हूं ।

हालाँकि, जैसे-जैसे परियोजना बड़ी होती जाती है, आपके पास कई उप-फ़ोल्डर होंगे:

sourceSets {
    main {
        res.srcDirs =
            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]
    }
}

बड़ी समस्या नहीं है, लेकिन:

  • यह बहुत सुंदर नहीं है क्योंकि सूची बहुत लंबी हो गई है।
  • आपको अपना app/build.gradleहर बार नया फ़ोल्डर जोड़ने के लिए बदलना होगा ।

सुधार की

इसलिए मैंने सभी नेस्टेड फ़ोल्डरों को हथियाने के लिए एक सरल ग्रूवी विधि लिखी:

def getLayoutList(path) {
    File file = new File(path)
    def throwAway = file.path.split("/")[0]
    def newPath = file.path.substring(throwAway.length() + 1)
    def array = file.list().collect {
        "${newPath}/${it}"
    }
    array.push("src/main/res");
    return array
}

इस विधि को android {...}ब्लॉक के बाहर अपने में चिपकाएँ app/build.gradle


कैसे इस्तेमाल करे

इस तरह एक संरचना के लिए:

<project root>
├── app <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

इसे इस तरह उपयोग करें:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("app/src/main/res/layouts/")
        }
    }
}

यदि आपके पास इस तरह की संरचना है:

<project root>
├── my_special_app_name <---------- TAKE NOTE
├── build
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

आप इसे इस तरह उपयोग करेंगे:

android {
    sourceSets {
        main {
            res.srcDirs = getLayoutList("my_special_app_name/src/main/res/layouts/")
        }
    }
}

व्याख्या

getLayoutList()a relative pathतर्क के रूप में लेता है। relative pathपरियोजना के रूट के सापेक्ष है। इसलिए जब हम इनपुट करते हैं "app/src/main/res/layouts/", तो यह सभी सबफ़ोल्डर्स के नाम को एक एरे के रूप में लौटाएगा, जो बिल्कुल उसी तरह होगा:

            [
                    'src/main/res/layouts/somethingA',
                    'src/main/res/layouts/somethingB',
                    'src/main/res/layouts/somethingC',
                    'src/main/res/layouts/somethingD',
                    'src/main/res/layouts/somethingE',
                    'src/main/res/layouts/somethingF',
                    'src/main/res/layouts/somethingG',
                    'src/main/res/layouts/somethingH',
                    'src/main/res/layouts/...many more',
                    'src/main/res'
            ]

यहाँ समझने के लिए टिप्पणियों के साथ स्क्रिप्ट है:

def getLayoutList(path) {
    // let's say path = "app/src/main/res/layouts/
    File file = new File(path)

    def throwAway = file.path.split("/")[0]
    // throwAway = 'app'

    def newPath = file.path.substring(throwAway.length() + 1) // +1 is for '/'
    // newPath = src/main/res/layouts/

    def array = file.list().collect {
        // println "filename: ${it}" // uncomment for debugging
        "${newPath}/${it}"
    }

    array.push("src/main/res");
    // println "result: ${array}" // uncomment for debugging

    return array
}

आशा है ये मदद करेगा!


मैंने आपके दृष्टिकोण का उपयोग किया लेकिन गतिविधि में इसका उपयोग कैसे करें? मैंने व्यवस्थापन नामक लेआउट फ़ोल्डर में सबफ़ोल्डर बनाया और जब मैं गतिविधि में हूँ, तो उसका admin_home लेआउट है और setContentView(R.layout.Admin.admin_home .)Admin.admin_home का उपयोग नहीं किया गया है
Asmaa Rashad

आप इसे सामान्य रूप से उपयोग करने में सक्षम होना चाहिए, जैसे R.layout.admin_home। स्क्रिप्ट को स्वचालित रूप से आपके लिए नाम लेने में सक्षम होना चाहिए। मुझे पता है अगर आप इसे काम कर सकते हैं।
मैं मेंढक ड्रैगन

यह अच्छी तरह से काम करता है, लेकिन इस लाइन array.push("src/main/res");को बदलने के बाद def res="src/main/res"; array.push(res);क्योंकि मुझे एक त्रुटि है क्योंकि पुश चाहते हैं कि गैस्ट्रिंग पैरामीटर एक स्ट्रिंग न हो। यदि मेरे बजाय किसी ने भी इस त्रुटि को पाया तो आप इसे संपादित कर सकते हैं
अस्मा राशद

1
सबफ़ोल्डर्स में लेआउट एंड्रॉइड नेमस्पेस को हल करने में सक्षम नहीं हैं। कोई विचार ?
जगुआर

क्या आप उन पंक्तियों को अनसुना कर सकते हैं // uncomment for debuggingऔर फिर जाँच सकते हैं कि क्या आउटपुट src/main/res/layouts/<your_layout_files>ठीक से पाए गए हैं?
मैं एक मेंढक अजगर हूं

15

अब हम आसानी से JetBrains प्लगइन के साथ कर सकते हैं जिसे " एंड्रॉइड फाइल ग्रुपिंग " कहा जाता है।

इस लिंक को देखें

Android फ़ाइल समूहन

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


सही उत्तर के रूप में चिह्नित किया जाना चाहिए, क्योंकि केवल साधारण नाम सम्मेलन के साथ समूह को व्यवस्थित करें। अपडाउन, या एप के डिफॉल्ट डायरेक्टरी स्ट्रक्चर को बदलने की जरूरत नहीं है। सभी लेआउट अभी भी लेआउट फ़ोल्डर में रहता है लेकिन में बांटा जाता हैAndroid Studio
एलिरेज़ा Fattahi

1
यह स्वीकृत उत्तर नहीं होना चाहिए क्योंकि यह Android दृश्य में काम नहीं कर रहा है .... (लेकिन मुझे यह विचार पसंद है ^ ^)
Appyx

यह एंड्रॉइड के अंतिम अंतिम संस्करण के लिए काम नहीं करता है ... क्या कोई अपडेटेड संस्करण है?
user3053247

7

एक तरह से मैंने इसे अपनी परियोजना में वास्तविक रेस फ़ोल्डर के समान स्तर पर एक अलग रेस फ़ोल्डर बनाने के लिए किया था, तब आप इसे अपने ऐप्स में उपयोग कर सकते हैं। buildle

android {
    //other stuff

    sourceSets {
        main.res.srcDirs = ['src/main/res', file('src/main/layouts').listFiles()]
    }
}

उदाहरण फ़ोल्डर संरचना

तब आपके नए रेस फ़ोल्डर का प्रत्येक सबफ़ोल्डर प्रत्येक विशेष स्क्रीन या आपके ऐप में कुछ से संबंधित हो सकता है, और प्रत्येक फ़ोल्डर में चीजों को व्यवस्थित रखने का अपना layout/ drawable/ valuesआदि होगा और आपको इनमे से कुछ की तरह मैन्युअल रूप से ग्रेड फ़ाइल को अपडेट करना होगा। उत्तर की आवश्यकता होती है (जब आप इसके बारे में जानते हैं तो नए संसाधन फ़ोल्डर को जोड़ने के लिए हर बार अपने सिंक को सिंक करें और अपनी xml फ़ाइलों को जोड़ने से पहले संबंधित सबफ़ोल्डर्स को जोड़ना सुनिश्चित करें)।


4

बैश फ्लैटन फ़ोल्डर फ़ोल्डर की जाँच करें जो फ़ोल्डर पदानुक्रम को एकल फ़ोल्डर में परिवर्तित करता है


जल्द ही इसकी जांच कराएंगे। धन्यवाद
परेश मेयानी १ani

1
वह स्क्रिप्ट फ़ाइल नाम में निर्देशिका पदानुक्रम को शामिल करने के लिए फ़ाइल नाम में परिवर्तन करती है। आपके एंड्रॉइड आईडीई के साथ फ़ाइल नाम के साथ काम करने का तरीका सभी जगह कैसे बदल जाएगा?
चुपके रब्बी

3

यदि आप एक लिनक्स या एक मैक बॉक्स पर विकसित कर रहे हैं, तो एक वर्कअराउंड होगा, सबफ़ोल्डर्स बनाने के लिए जिसमें आपके लेआउटफाइल्स के प्रतीकात्मक लिंक शामिल हैं। बस के साथ ln कमांड का उपयोग करें

ln -s PATH_TO_YOUR_FILE

इसके साथ समस्या यह है, कि आपके लेआउट फ़ोल्डर में अभी भी सभी .xml फाइलें हैं। लेकिन आप हालांकि उप-फ़ोल्डर्स का उपयोग करके उन्हें चुन सकते हैं। यह सबसे पास की चीज है, जो आप करना चाहते हैं।

मैं अभी पढ़ता हूं, कि यह विंडोज के साथ काम कर सकता है, भले ही आप विस्टा का उपयोग कर रहे हों या बाद में। यह mklinkआज्ञा है। बस इसे google करें, कभी भी इसे खुद इस्तेमाल न करें।

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


1
विभिन्न उपनिर्देशिकाओं में घटकों को अलग करके भंडारण को संशोधित करने के उद्देश्य को पराजित करने के उद्देश्य को पराजित करने में एक सिमलिंक लगाना: प्रभावी रूप से इसे कम के बजाय अधिक जटिल बनाना। ग्रैड अतिरिक्त संसाधन निर्देशिकाओं के विनिर्देशों की अनुमति देता है।
रिचीएच

3

जबकि कई संसाधन सेट के सभी प्रस्ताव काम कर सकते हैं, समस्या यह है कि एंड्रॉइड स्टूडियो ग्रैडल प्लग-इन के लिए वर्तमान तर्क नेस्टेड संसाधन सेटों के लिए बदलने के बाद संसाधन फ़ाइलों को अपडेट नहीं करेगा। वर्तमान कार्यान्वयन स्टार्टविथ () का उपयोग करके संसाधन निर्देशिकाओं की जांच करने का प्रयास करता है, इसलिए एक निर्देशिका संरचना जो नेस्टेड है (यानी src / main / res / लेआउट / लेआउट और src / main / res / लेआउट / लेआउट_category2) src / main / res का चयन करेंगे / लेआउट / लेआउट लगातार और कभी नहीं वास्तव में परिवर्तन अद्यतन। अंतिम परिणाम यह है कि आपको हर बार परियोजना का पुनर्निर्माण / सफाई करनी होगी।

मैंने चीजों को सुलझाने में मदद करने के लिए https://android-review.googlesource.com/#/c/157971/ पर एक पैच जमा किया ।


मैं आपके साथ सहमत हूँ कि AS XML फ़ाइलों में परिवर्तन को नोट नहीं करता है। लेकिन इसका हल क्या है? मैं stackoverflow.com/questions/32317822/… की कोशिश करूँगा ।
कूलमैन्ड

3

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

sourceSets.each {
    def rootResDir = it.res.srcDirs[0]
    def getSubDirs = { dirName ->
        def layoutsDir = new File(rootResDir, dirName)
        def subLayoutDirs = []
        if (layoutsDir.exists()) {
            layoutsDir.eachDir {
                subLayoutDirs.add it
            }
        }
        return subLayoutDirs
    }
    def resDirs = [
            "anims",
            "colors",
            "drawables",
            "drawables-hdpi",
            "drawables-mdpi",
            "drawables-xhdpi",
            "drawables-xxhdpi",
            "layouts",
            "valuess",
    ]
    def srcDirs = resDirs.collect {
        getSubDirs(it)
    }
    it.res.srcDirs = [srcDirs, rootResDir]
}

व्यवहार में कैसे करें?

उदाहरण के लिए, मैं नाम के activityलिए सबफ़ोल्डर बनाना चाहता हूं layout, resDirsजैसे चर में किसी भी नाम से एक स्ट्रिंग जोड़ें layouts, फिर लेआउट xml फ़ाइल को अंदर डाला जाना चाहिएres\layouts\activity\layout\xxx.xml

अगर मुझे नाम के selectorsलिए सबफ़ोल्डर बनाना है , तो चर drawableमें किसी भी नाम से एक स्ट्रिंग जोड़ें, resDirsजैसे drawablesकि ड्रा करने योग्य xml फ़ाइल अंदर डालनी चाहिए res\drawables\selectors\drawable\xxx.xml

फ़ोल्डर नाम जैसे कि layoutsऔर चर drawablesमें परिभाषित किया गया resDirsहै, यह कोई भी स्ट्रिंग हो सकता है। आपके द्वारा बनाए गए सभी सबफ़ोल्डर जैसे कि activityया फ़ोल्डर selectorsके समान ही resमाने जाते हैं। इसलिए selectorsफ़ोल्डर में, हमें drawableअतिरिक्त रूप से फ़ोल्डर बनाना चाहिए और xml फ़ाइलों को drawableफ़ोल्डर में रखना चाहिए , इसके बाद ग्रेडेल xml फ़ाइलों को सामान्य रूप से ड्रा करने योग्य के रूप में पहचान सकता है।


इसे सही उत्तर माना जाना चाहिए! सरल और पूरी तरह से काम!
Gláucio लियोनार्डो सेंट'ना

2

यदि आप स्वीकृत उत्तर में विधि का उपयोग करते हैं, और इसे थोड़ा सुधारना चाहते हैं, तो इस तरह से ग्रेडिंग सेटिंग बदलें:

    sourceSets {
    main {
        res.srcDirs = [
            file("src/main/res/layouts/").listFiles(),
            "src/main/res/layouts",
            "src/main/res"
        ]
    }
}

इसलिए यदि आप अधिक फ़ोल्डर्स और लेआउट जोड़ते हैं, तो आपको यहाँ वापस आने की ज़रूरत नहीं है और स्रोत फ़ोल्डरों की एक लंबी सूची को जोड़ना होगा, चलो सभी फ़ोल्डरों को आपके लिए प्राप्त करने दें।


1
  • चरण 1: लेआउट पर राइट क्लिक करें - एक्सप्लोरर में दिखाएं
  • चरण 2: लेआउट फ़ोल्डर खोलें और सीधे सबफ़ोल्डर्स बनाएँ: layout_1, layout_2 ...
  • चरण 3: खुले लेआउट_1 फ़ोल्डर लेआउट बनाएं (नोट: अनिवार्य नाम लेआउट है), खुले लेआउट_2 फ़ोल्डर लेआउट उपनिर्देशिका बनाएं (ध्यान दें: अनिवार्य नाम लेआउट है) ...
  • चरण 4: लेआउट 1 और लेआउट 2 में लेआउट उपनिर्देशिकाओं में xml फ़ाइलों की प्रतिलिपि बनाएँ
  • चरण 5: buid.grad (मॉड्यूल ऐप) में कोड चलाएँ और अब सिंक करें:

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • चरण 6: सारांश: ऊपर दिए गए सभी चरण केवल फ़ोल्डर को 'प्रोजेक्ट' मोड में प्रदर्शित करने में मदद करेंगे, जबकि 'एंड्रॉइड' मोड सामान्य रूप से प्रदर्शित होगा।
  • इसलिए मुझे लगता है कि शायद उपसर्गों का नामकरण क्लस्टरिंग फ़ोल्डर के रूप में प्रभावी है।

Projectमोड के लिए धन्यवाद । मुझे समझ नहीं आ रहा था कि सबफ़ोल्डर्स कहाँ गायब हो गए ( Androidमोड में)।
CoolMind

0

खैर, संक्षिप्त जवाब नहीं है। लेकिन आपके पास निश्चित रूप से कई resफ़ोल्डर हो सकते हैं । मुझे लगता है कि, आप layoutफ़ोल्डर के लिए सबफ़ोल्डर्स प्राप्त कर सकते हैं जितना करीब है । यहाँ आप इसे कैसे करते हैं।


1
स्वीकृत उत्तर की जांच करें। मैंने इसे व्यक्तिगत रूप से आज़माया नहीं है, लेकिन अगर आप जाँच और अद्यतन कर सकते हैं तो यह मददगार होगा!
परेश मेयानी

0

शीर्ष उत्तरों के कई नुकसान हैं: आपको नए लेआउट पथ जोड़ने होंगे, AS नए संसाधनों को res\layoutsफ़ोल्डर में रखने के बजाय रखता है res\values

कई उत्तरों को मिलाकर मैंने ऐसा ही लिखा:

sourceSets {
    main {
        res.srcDirs =
                [
                        'src/main/res',
                        file("src/main/res/layouts/").listFiles(),
                        'src/main/res/layouts'
                ]
    }
}

मैंने इस लेख के साथ फ़ोल्डर्स बनाए: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ । सबफ़ोल्डर्स बनाने के लिए आपको इस मेनू का उपयोग करना चाहिए: नया> फ़ोल्डर> Res फ़ोल्डर।

अपडेट करें

कुछ हफ़्तों के बाद मैंने पाया कि Android Studio द्वारा संसाधनों में परिवर्तन नहीं देखा गया है । तो, कुछ अजीब कीड़े दिखाई देते हैं। उदाहरण के लिए, लेआउट पुराने आकार, मार्जिन दिखाना जारी रखते हैं। कभी-कभी AS को नई XML-फ़ाइलें नहीं मिलती हैं (विशेषकर रन-टाइम के दौरान)। कभी-कभी यह view idएस (किसी अन्य एक्सएमएल-फ़ाइल के संदर्भ) को मिलाता है । इसे अक्सर दबाने Build > Clean Projectया करने की आवश्यकता होती है Build > Rebuild ProjectAndroid स्टूडियो में xml लेआउट फ़ाइलों को बदलने के बाद आवश्यक पुनर्निर्माण पढ़ें ।


आपकी टिप्पणी 'मैंने इस लेख (संलग्न लिंक) के साथ फ़ोल्डर्स बनाए' एसओ पर समाधान प्रदान करने के लिए एक स्वीकार्य तरीका नहीं है आपका उत्तर अस्पष्ट है। आप निर्देश छोड़ सकते हैं और एक लिंक के साथ लेखक को श्रेय दे सकते हैं। अन्यथा, यह सिर्फ आलसी है।
जंगलेदेव

@jungledev, ठीक है, आखिरकार मैंने इस विचार को अस्वीकार कर दिया और एक पारंपरिक resफ़ोल्डर में लौट आया , क्योंकि एएस फ़ोल्डर में संसाधनों को विभाजित करने में पूरी तरह से समर्थन नहीं करता है। संभवतः मैं इस उत्तर को बदल दूंगा या हटा भी दूंगा। लेकिन जब एसओ यहां समाधान प्रदान करने के लिए एक स्वीकार्य तरीका नहीं है, तो यह कहने का क्या मतलब है?
कूलमाइंड

मैंने जो कहा, उसका ठीक मतलब है। मत कहो 'मैंने इसे इस ट्यूटोरियल के साथ किया था .... (लिंक डालें)।' आपको क्या कहना चाहिए: "मैंने इस ट्यूटोरियल (लिंक डालें) का अनुसरण किया और यहां मेरे लिए काम करने वाले चरण हैं। चरण 1, चरण 2, चरण 3 ... आदि 'आपको उत्तर में चरणों को शामिल करने की आवश्यकता है। बस एक ट्यूटोरियल से लिंक करना अस्वीकार्य है।
जंगलबेव

0

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

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.