অ্যান্ড্রয়েড লেআউট ফোল্ডারে কি সাবফোল্ডার থাকতে পারে?


550

এই মুহুর্তে, আমি প্রতিটি এক্সএমএল লেআউট ফাইলটি res/layoutফোল্ডারের ভিতরে সংরক্ষণ করছি , সুতরাং ছোট প্রকল্পগুলি পরিচালনা করা সম্ভব এবং সহজ, তবে যখন বড় এবং ভারী প্রকল্পের ক্ষেত্রে দেখা যায়, তখন ভিতরে একটি স্তরক্রম এবং সাব-ফোল্ডার থাকা দরকার লেআউট ফোল্ডার

যেমন

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

একইভাবে, আমরা বড় অ্যাপ্লিকেশনটির জন্য সাব-ফোল্ডার রাখতে চাই, সুতরাং অ্যান্ড্রয়েড প্রকল্পের অভ্যন্তরে এটি করার কোনও উপায় আছে কি?

আমি লেআউট ফোল্ডারের অভ্যন্তরে লেআউট-ব্যক্তিগত এবং লেআউট_এড্রেস সাব-ফোল্ডারগুলি তৈরি করতে সক্ষম হয়েছি, কিন্তু যখন সময় এসেছে আরএমএল লেআউট ফাইলটিতে আর.লেআউটআউট ._______ ব্যবহার করে, তখন কোনও ভিতরে এক্সএমএল লেআউট পপ-আপ নেই the তালিকা.



আমি মনে করি এই লিঙ্কটি আপনাকে বিশদে সাহায্য করতে পারে। blog.mindorks.com/…
দিলীপ পাডেল

উত্তর:


475

আপনি গ্রেড দিয়ে এটি করতে পারেন। আমি একটি ডেমো প্রকল্প তৈরি করেছি কীভাবে তা দেখায়।

কৌশলটি হ'ল একাধিক সংস্থান ফোল্ডারগুলিকে একত্রিত করার গ্রেডের ক্ষমতা ব্যবহার করা , এবং উত্সসেটস ব্লকে রেস ফোল্ডার পাশাপাশি নেস্টেড সাবফোল্ডারগুলি সেট করা।

কৌতূহলটি হ'ল আপনি যে ফোল্ডারের চাইল্ড রিসোর্স ফোল্ডারগুলি ঘোষণা করার আগে আপনি কোনও ধারক সংস্থান ফোল্ডারটি ঘোষণা করতে পারবেন না।

নীচে ডেমো থেকে বিল্ড। অ্যাড্রেড ফাইল থেকে উত্সসেটস ব্লক রয়েছে। লক্ষ্য করুন যে সাবফোল্ডারগুলি প্রথমে ঘোষণা করা হয়েছে।

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

নেস্টেড রিসোর্সেস ছবি

এছাড়াও, আপনার প্রকৃত রিসোর্স ফাইলের সরাসরি পিতামাতাকে (পিএনজি, এক্সএমএল লেআউট, ইত্যাদি ..) এখনও নির্দিষ্টকরণের সাথে মিল রাখতে হবে ।


6
অঙ্কনযোগ্য ফোল্ডারগুলি দিয়ে এটি করা কি সম্ভব? আমি কেবল কোনও ভাগ্য ছাড়াই চেষ্টা করেছি, এমনকি ঘোষণাপত্রের আদেশটিও আমলে নিয়েছি।
ট্রেভর-ই

7
নিস! কেবল মনে রাখবেন যে আপনি রিসোর্স ফোল্ডারগুলিকে একীভূত করার জন্য কেবল গ্রেডের দক্ষতাকেই কাজে লাগাচ্ছেন এবং এটি অর্থবোধ করবে।
eski

5
ফোল্ডারে ফাইলের নাম এখনো অনন্য হতে হবে এবং কোডে আপনাকে জানাতে চাই যে যেমন আছে R.layout.list_itemথেকে আসছে moviesবা cinemasফোল্ডারের, তাই ফ্ল্যাট নামকরণ এখনও প্রযোজ্য।
TWiStErRob

5
দুর্ভাগ্যবশত যে সঙ্গে আমার জন্য কাজ করে না build:gradle:0.14.4এবং buildToolsVersion "21.1.1"
কামিল লেলোনেক

32
এটি কাজ করে, তবে উত্তরটি ব্যাখ্যা করার জন্য একটি দু: খজনকভাবে অপর্যাপ্ত কাজ করে যে আপনি যে প্রতিটি সাবফোল্ডার যুক্ত করেছেন তার ভিতরে একটি দ্বিতীয় সাবফোল্ডার থাকা দরকার, যা কেবলমাত্র "লেআউট" বলা যেতে পারে, এবং আপনার সমস্ত লেআউট ফাইলের অভ্যন্তরে যেতে হবে দ্বিতীয় সাবফোল্ডার (গুলি)। কাজ করার জন্য কয়েক ডজন মন্তব্য পড়ে পড়া আদর্শ থেকে দূরে। এবং যে কেউ এখনও খুঁজছেন, অতিরিক্ত "লেআউট" সাবফোল্ডারগুলি সেট আপ করা সমস্যার সমাধান URI is not registered
অ্যারোথ

233

উত্তর না হয়।

আমি আপনার দৃষ্টি আকর্ষণ করতে চাই এই প্রো প্রো অ্যান্ড্রয়েড 2 বইয়ের দিকে যা আকর্ষণীয়:

এটি সম্পদ সম্পর্কিত কয়েকটি সীমাবদ্ধতাও লক্ষ্য করার মতো। প্রথমত, অ্যান্ড্রয়েড পুনরায় সংস্থার অধীনে পূর্বনির্ধারিত ফোল্ডারগুলির মধ্যে কেবল ফাইলের লিনিয়ার তালিকার সমর্থন করে। উদাহরণস্বরূপ, এটি লেআউট ফোল্ডারের নীচে নেস্টেড ফোল্ডারগুলি সমর্থন করে না (বা অন্য ফোল্ডারগুলি রেস এর অধীনে)।

দ্বিতীয়ত, সম্পদ ফোল্ডার এবং পুনর্নির্মাণের অধীনে কাঁচা ফোল্ডারের মধ্যে কিছু মিল রয়েছে। উভয় ফোল্ডারে কাঁচা ফাইল থাকতে পারে তবে কাঁচার মধ্যে থাকা ফাইলগুলি সংস্থান হিসাবে বিবেচিত হয় এবং সম্পদের মধ্যে থাকা ফাইলগুলি নয়।

নোট করুন যেহেতু সম্পদ ফোল্ডারের বিষয়বস্তুগুলিকে সংস্থান হিসাবে বিবেচনা করা হয় না, আপনি এর মধ্যে ফোল্ডার এবং ফাইলগুলির একটি স্বেচ্ছাসেবী স্তরক্রম স্থাপন করতে পারেন ।


3
আমি অতিথি হয়েছি আমাদের পরের সেরা আশাটি হল একটি Eclipse বা IntelliJ প্লাগইন যা ফাইল নাম উপসর্গের উপর ভিত্তি করে ফাইলগুলি ভেঙে দিতে পারে।
জেরি ব্র্যাডি

15
@ জাস্টিন আমি গ্রেডের জন্য পোস্ট করা সমাধানটি পরীক্ষা করে দেখুন।
eski

আমি অনুমান করি যে একটি সমাধান ফাইলগুলির নামকরণ যেমন আপনি তাদের শ্রেণীবদ্ধ করতে চান, তাই দেখে মনে হচ্ছে এটি সাবফোল্ডারে রয়েছে ers আমি নামের শুরুতে একটি "সাবফোল্ডার ট্যাগ" যুক্ত করব। উদাহরণ স্বরূপ. সমস্ত ক্রিয়াকলাপ হবে "কার্যকলাপ_অ্যাক্টিভিটি নাম.এক্সএমএল" এবং একটি শিশু ক্রিয়াকলাপ "ক্রিয়াকলাপ_অ্যাক্টিভিটি নাম_চিল্ড্যাকটিভিটি.এক্সএমএল" ইত্যাদি হতে পারে। অন্য যে কোনও ফাইল হ'ল "other_filename.xML"। বিভ্রান্তি এড়াতে আমি এটাই করি। অভিশাপ, কেউ আমাকে মারছে। তিন বছরের মধ্যে>। <আমার খারাপ, এটি দেখেনি।
বেদব্যাস ভাট

1
এখানে উল্লেখ করা জরুরী যে rawউত্স হিসাবে বিবেচনা করে আপনি ঘনত্ব / অভিমুখীকরণ / সংস্করণ / ইত্যাদি নির্ভরশীল স্ট্রিপিং পান, যখন আপনার সাথে assetsম্যানুয়ালি এটি করতে হয়।
TWiStErRob

1
এই উত্তরটি অ্যান্ড্রয়েড মূলধারার প্রতিস্থাপনের বিরুদ্ধে যুক্তি হিসাবে বেছে নিয়েছে।
জোন

77

আমি সমস্যাগুলি থাকা লোকদের জন্য কেবল এস্কিসের দুর্দান্ত উত্তরটিতে যুক্ত করতে চেয়েছিলাম। (দ্রষ্টব্য: এটি কেবল কাজ করবে এবং দুর্ভাগ্যবশত 'অ্যান্ড্রয়েড' দর্শন নয়, 'প্রকল্প' ভিউয়ের অভ্যন্তরে পৃথক ডিরেক্টরিগুলির মতো দেখাবে))

নিম্নলিখিত সঙ্গে পরীক্ষিত। বিল্ডটুলস ভার্সন = 23.0.0 গ্রেড 1.2.3 এবং 1.3.0

এইভাবে আমি ইতিমধ্যে নির্মিত প্রকল্পের সাথে কাজ করতে পেলাম।

  1. আপনার লেআউট ডিরেক্টরি থেকে সমস্ত এক্সএমএল ফাইল অনুলিপি করুন এবং সেগুলি ডেস্কটপে কোনও ডিরেক্টরিতে বা ব্যাকআপের জন্য রেখে দিন into
  2. পুরো লেআউট ডিরেক্টরি মুছুন (নিশ্চিত করুন যে আপনি পদক্ষেপ 1 থেকে সমস্ত কিছু ব্যাক আপ করেছেন!)
  3. রেস ডিরেক্টরিটি ডান ক্লিক করুন এবং নতুন> ডিরেক্টরি নির্বাচন করুন।
  4. এই নতুন ডিরেক্টরিটির নাম দিন "লেআউট"। (এটি আপনি যা চান তা হতে পারে তবে এটি 'ফ্রেগমেন্ট' ডিরেক্টরি বা 'ক্রিয়াকলাপ' ডিরেক্টরি হবে না, এটি পরে আসে)।
  5. নতুন "লেআউট" ডিরেক্টরিটি ডান ক্লিক করুন এবং নতুন> ডিরেক্টরি নির্বাচন করুন। (এটি এতে থাকা ধরণের এক্সএমএল ফাইলের নাম হবে, উদাহরণস্বরূপ, 'টুকরা' এবং 'ক্রিয়াকলাপ')।
  6. 'খণ্ড' বা 'ক্রিয়াকলাপ' ডিরেক্টরিটিতে ডান ক্লিক করুন (দ্রষ্টব্য: এটি 'ফ্রেগমেন্ট' বা 'ক্রিয়াকলাপ' হতে হবে না যা আমি উদাহরণ হিসাবে ব্যবহার করছি) এবং নতুন> ডিরেক্টরিটি আবার নির্বাচন করুন এবং এই ডিরেক্টরিটির নাম দিন "লেআউট"। (দ্রষ্টব্য: এটির নাম 'লেআউট' রাখা উচিত !!! খুব গুরুত্বপূর্ণ)।
  7. আপনি আপনার ডেস্কটপে তৈরি ব্যাকআপ থেকে নতুন 'লেআউট' ডিরেক্টরিতে চাইলে এক্সএমএল ফাইলগুলি রেখে দিন।
  8. আপনার ইচ্ছামত কাস্টম ডিরেক্টরিগুলির জন্য 5 - 7 ধাপ পুনরাবৃত্তি করুন।
  9. এটি সম্পূর্ণ হয়ে গেলে আপনার মডিউল গ্রেডলে যায়। !! আমি নীচে দেখিয়ে দিচ্ছি)।

    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 এবং বিল্ডটুলস সংস্করণ 23.0.2 এ কাজ করে! নোট করুন কনফিগার মানটি 'src/main/res/layouts/content'এবং এই কনফিগারেশনের পথটি হল'src/main/res/layouts/content/layout'
cWsu


2
কোনও ভাগ্যবিহীনভাবে অল্প সময়ের জন্য অনুসন্ধান করা হয়েছে, এটি আমার জন্য কাজ করা একমাত্র সমাধান। ছবি সহ এই জাতীয় বিস্তারিত পোস্ট দেওয়ার জন্য ধন্যবাদ!
মেশিন ট্রাইব

52

সম্ভব নয়, তবে লেআউট ফোল্ডারটি নাম অনুসারে বাছাই করা হয়েছে। সুতরাং, আমি আমার প্যাকেজ নামগুলির সাথে লেআউট ফাইলের নামগুলি পূর্বেই রেখেছি। উদাহরণস্বরূপ "কেনা" এবং "প্লে করা" দুটি প্যাকেজের জন্য:

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

20

আমি অ্যান্ড্রয়েড স্টুডিওর জন্য অ্যান্ড্রয়েড ফাইল গ্রুপিং প্লাগইন ব্যবহার করি t এটি আপনাকে সত্যিই সাব-ফোল্ডার তৈরি করার অনুমতি দেয় না, তবে এটি আপনার ফাইল এবং সংস্থানগুলি বিভিন্ন ফোল্ডারে থাকায় এটি প্রদর্শন করতে পারে। এবং এই আমি চেয়েছিলেন ঠিক কি।

এর মাধ্যমে আপনি "অ্যান্ড্রয়েড ফাইল গ্রুপিং" প্লাগইন ইনস্টল করতে পারেন

উইন্ডোজ:

অ্যান্ড্রয়েড স্টুডিও -> ফাইল -> সেটিংস -> প্লাগইন।

ম্যাক:

অ্যান্ড্রয়েড স্টুডিও -> অ্যান্ড্রয়েড স্টুডিও ট্যাব (শীর্ষ বাম) -> পছন্দসমূহ -> প্লাগইনস -> জেটব্রেইন প্লাগইন ইনস্টল করুন ..

ম্যাকের জন্য, আমি এটি পরীক্ষা করতে সক্ষম হয়েছি এবং প্লাগইন অনুসন্ধান করতে সক্ষম হইনি। তাই আমি এখান থেকে প্লাগইন ডাউনলোড করেছি এবং Install plugin from diskউপরের সেটিংস থেকে বিকল্পটি ব্যবহার করেছি ।


সেই প্লাগইনটির লিঙ্কটিও শেয়ার করুন!
পরেশ মায়ানী

সম্পন্ন. > ফাইল - -> সেটিংস -> প্লাগইন যাইহোক আপনি সবসময় জন্য "Android ফাইল গোষ্ঠীবদ্ধ" অ্যান্ড্রয়েড স্টুডিওতে অনুসন্ধান করতে পারেন
শার্প

3
প্লাগইনটি "অ্যান্ড্রয়েড" ভিউতে কাজ করেনি, কেবল "প্রকল্প" দেখুন: /
হুগো গ্রেস

18

এখন অ্যান্ড্রয়েড স্টুডিও এবং গ্রেডল দিয়ে আপনার প্রকল্পে একাধিক সংস্থান ফোল্ডার থাকতে পারে। আপনার লেআউট ফাইলগুলিই নয় তবে যে কোনও ধরণের সংস্থানকে সংগঠিত করার অনুমতি দেওয়া হচ্ছে।

এটি হুবহু একটি সাব-ফোল্ডার নয়, তবে এটি আপনার অ্যাপ্লিকেশনটির কিছু অংশ আলাদা করতে পারে।

কনফিগারেশনটি এরকম:

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

ডকুমেন্টেশন চেক করুন ।


2
আমি লক্ষ্য করেছি যে প্রতিবার আমি এই সেটিং এর আওতায় কোনও বিন্যাসে পরিবর্তন করেছি, cleanঅ্যাপটিতে প্রতিবিম্বিত হওয়ার জন্য আমাকে সর্বদা একটি কাজ করতে হয়েছিল।
পবন কুমার

16

আমি মনে করি এই সমস্যার সর্বাধিক মার্জিত সমাধান (সাব-ফোল্ডারগুলির অনুমতি নেই তবে) যে ফোল্ডারের ভিতরে আপনি রেখেছিলেন সেটির নাম সহ ফাইলের নামগুলি পুনরায় চাপিয়ে দেওয়া। উদাহরণস্বরূপ, যদি আপনার কোনও ক্রিয়াকলাপ, অংশবিশেষ বা "স্থানগুলি" নামে পরিচিত সাধারণ দৃষ্টিভঙ্গির জন্য একগুচ্ছ লেআউট থাকে তবে আপনার কেবল স্থান_ম_এ_আউটআউট_নামের সাহায্যে এটিকে প্রিপেন্ড করা উচিত। কমপক্ষে এটি তাদের সংগঠিত করার সমস্যাটি এমনভাবে সমাধান করে যাতে তারা IDE এর মধ্যে খুঁজে পাওয়া সহজ। এটি সবচেয়ে দুর্দান্ত সমাধান নয়, তবে এটি কোনও কিছুর চেয়ে ভাল।


15

ছোট সমস্যা

আমি এই প্রশ্নের শীর্ষের উত্তর অনুসরণ করে সাবফোল্ডারগুলি অর্জন করতে সক্ষম হয়েছি ।

তবে, প্রকল্পটি বড় হওয়ার সাথে সাথে আপনার অনেকগুলি সাব-ফোল্ডার থাকবে:

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
}

আশা করি এটা সাহায্য করবে!


আমি আপনার পদ্ধতির ব্যবহার করেছি কিন্তু কীভাবে এটি ক্রিয়ায় ব্যবহার করব? আমার তৈরি লেআউট মধ্যে subfolder admin নামে ফোল্ডার এবং এটা admin_home বিন্যাস হয়েছে যখন আমি কার্যকলাপ মধ্যে আছি এবং ব্যবহার setContentView(R.layout.Admin.admin_home .)Admin.admin_home সমাধান না করা হয়
আসমা রাশাদ

আপনার পছন্দ মতো এটি সাধারণভাবে ব্যবহার করতে সক্ষম হওয়া উচিত R.layout.admin_home। স্ক্রিপ্টটি আপনার জন্য স্বয়ংক্রিয়ভাবে নামগুলি তুলতে সক্ষম হবে। আপনি যদি এটি কাজ করতে পারেন তবে আমাকে জানান।
আমি

এটা ভাল কাজ করে কিন্তু এই লাইন পরিবর্তন করার পর array.push("src/main/res");থেকে def res="src/main/res"; array.push(res);কারন আমি ধাক্কা যেমন একটি ত্রুটি আছে Gstring প্যারামিটার চান স্ট্রিং এক যে কোনো একটি বদলে আমাকে এই ত্রুটি আপনি এটা সম্পাদনা করতে পারেন পাওয়া .যদি
আসমা রাশাদ

1
সাবফোল্ডারে লেআউটগুলি অ্যান্ড্রয়েড নেমস্পেস সমাধান করতে সক্ষম নয়। কোন ধারনা ?
জাগুয়ার

আপনি কি এই লাইনগুলি দিয়ে // uncomment for debuggingকোনও অসুবিধে src/main/res/layouts/<your_layout_files>করতে পারেন এবং তারপরে আউটপুটগুলি সঠিকভাবে সনাক্ত করা যায় কিনা তা পরীক্ষা করতে পারেন ?
আমি

15

এখন আমরা সহজেই " অ্যান্ড্রয়েড ফাইল গ্রুপিং " নামে জেটব্রেইন প্লাগইনটি করতে পারি

এই লিঙ্কটি দেখুন

অ্যান্ড্রয়েড ফাইল গ্রুপিং

এখানে চিত্র বর্ণনা লিখুন


শুধুমাত্র সাধারণ নাম কনভেনশন সহ গ্রুপিংয়ের আয়োজন করার কারণে সঠিক উত্তর হিসাবে চিহ্নিত করতে হবে। গ্রেড, এমনকি কোনও অ্যাপ্লিকেশনের ডিফল্ট ডিরেক্টরি কাঠামো পরিবর্তন করার দরকার নেই। সমস্ত লেআউট এখনও লেআউট ফোল্ডারে রয়ে গেছে তবে এতে Android Studio
গ্রুপযুক্ত

1
গৃহীত উত্তর হওয়া উচিত নয় কারণ এটি অ্যান্ড্রয়েড ভিউতে কাজ করছে না .... (তবে আমি ধারণাটি পছন্দ করি ^^)
অ্যাপিক্স

এটি অ্যান্ড্রয়েডের শেষ শেষ সংস্করণে কাজ করে না ... কোনও আপডেট হওয়া সংস্করণ কী?
ব্যবহারকারী 3053247

7

এটি করার একটি উপায় হ'ল এটি হল আপনার প্রকল্পের আসল রেজ ফোল্ডারের মতো একই স্তরে একটি আলাদা রেস ফোল্ডার তৈরি করা, তবে আপনি এটি আপনার অ্যাপ্লিকেশন বিল্ড.gradle এ ব্যবহার করতে পারেন

android {
    //other stuff

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

উদাহরণস্বরূপ ফোল্ডার কাঠামো

তারপরে আপনার নতুন রেজ ফোল্ডারের প্রতিটি সাবফোল্ডারটি প্রতিটি নির্দিষ্ট স্ক্রিনের সাথে সম্পর্কিত হতে পারে বা আপনার অ্যাপ্লিকেশনের কিছু হতে পারে এবং প্রতিটি ফোল্ডারে নিজস্ব layout/ drawable/ valuesইত্যাদি জিনিসগুলি গুছিয়ে রাখতে হবে এবং আপনাকে অন্য কয়েকটিটির মতো গ্রেড ফাইলটি ম্যানুয়ালি আপডেট করতে হবে না উত্তরগুলির জন্য প্রয়োজনীয় (প্রতিটি বার আপনি যখন নতুন রিসোর্স ফোল্ডার যুক্ত করবেন তখন আপনার গ্রেডটি সিঙ্ক করুন যাতে এটি এটি সম্পর্কে জানতে পারে, এবং আপনার এক্সএমএল ফাইলগুলি যুক্ত করার আগে প্রাসঙ্গিক সাবফোল্ডার যুক্ত করার বিষয়টি নিশ্চিত করুন)।


4

ফোল্ডার স্তরক্রমকে একক ফোল্ডারে রূপান্তর করে বাশ ফ্ল্যাটেন ফোল্ডার স্ক্রিপ্টটি পরীক্ষা করুন


শীঘ্রই এটি পরীক্ষা করে দেখা হবে। ধন্যবাদ
পরেশ মায়ানী

1
সেই স্ক্রিপ্টটি ফাইলের নামের পরিবর্তে ফাইলের নামের ডিরেক্টরি স্তরক্রম অন্তর্ভুক্ত করে name কীভাবে আপনার অ্যান্ড্রয়েড আইডিইর সাথে পুরো জায়গাতেই ফাইলের নাম পরিবর্তন হবে?
স্টিলথ রাব্বি

3

আপনি যদি একটি লিনাক্স বা ম্যাক বাক্সে বিকাশ করছেন তবে আপনার লেআউটফাইলে প্রতীকী লিঙ্কগুলি অন্তর্ভুক্ত এমন সাবফোল্ডার তৈরি করা একটি কাজ হবে। শুধু -s এর সাথে ln কমান্ডটি ব্যবহার করুন

ln -s PATH_TO_YOUR_FILE

এটির সাথে সমস্যা হ'ল আপনার লেআউট ফোল্ডারে এখনও সমস্ত .xML ফাইল রয়েছে। তবে আপনি সাব-ফোল্ডার ব্যবহার করে সেগুলি নির্বাচন করতে পারেন। এটি আপনার কাছে যা চান তা নিকটতম জিনিস।

আমি কেবল পড়েছি, এটি উইন্ডোজের সাথেও কাজ করতে পারে, আপনি যদি ভিস্তা বা তার পরে ব্যবহার করেন। এই mklinkআদেশ আছে। এটি গুগল করুন, এটি নিজে কখনও ব্যবহার করেন নি।

আরেকটি সমস্যা হ'ল, যদি আপনার কাছে ফাইলটি খোলা থাকে এবং এটি আবার খোলার চেষ্টা করেন তবে প্লাগইনটি একটি নুল পয়েন্টার ব্যতিক্রম ছোঁড়ে। তবে এটি ঝুলছে না।


1
বিভিন্ন উপ-ডিরেক্টরিতে পৃথক করে পৃথক করে স্টোরেজকে মডুলারাইজ করতে ইচ্ছুক উদ্দেশ্যটিতে একটি সিলিমিংক রেখে দেওয়া: কার্যকরভাবে কমের পরিবর্তে আরও জটিল করে তোলা। গ্রেডল অতিরিক্ত সংস্থান ডিরেক্টরিগুলির বিশদকরণের অনুমতি দেয়।
রিচিএইচএইচ

3

একাধিক রিসোর্স সেটগুলির সমস্ত প্রস্তাব কার্যকর করতে পারে, তবে সমস্যাটি হ'ল অ্যান্ড্রয়েড স্টুডিও গ্রেডল প্লাগ-ইন-এর জন্য বর্তমান যুক্তিটি নেস্টেড রিসোর্স সেটগুলির জন্য পরিবর্তিত হওয়ার পরে রিসোর্স ফাইলগুলি আপডেট করবে না। প্রারম্ভিক প্রয়োগটি স্টার্ট উইথ () ব্যবহার করে রিসোর্স ডিরেক্টরিগুলি পরীক্ষা করার চেষ্টা করে, সুতরাং একটি ডিরেক্টরি কাঠামো যা নেস্টেড হয় (যেমন src / প্রধান / রেজি / লেআউট / লেআউটগুলি এবং এসসিআর / মেইন / রেজি / লেআউট / লেআউটগুলি / লেআউট_ শ্রেণীবদ্ধ 2) সিআরসি / মেইন / রেজিকে বেছে নেবে ধারাবাহিকভাবে এবং লেআউট / লেআউটগুলি আসলে পরিবর্তনগুলি আপডেট করে না। শেষ ফলাফলটি হ'ল আপনাকে প্রতিবার প্রকল্পটি পুনর্নির্মাণ / পরিষ্কার করতে হবে।

জিনিসগুলি সমাধানে সহায়তা করার জন্য আমি https://android-review.googlesource.com/#/c/157971/ এ একটি প্যাচ জমা দিয়েছি ।


আমি আপনার সাথে একমত যে এএসএমএল এক্সএমএল ফাইলগুলির পরিবর্তনগুলি নোট করে না। তবে এর সমাধান কী? আমি স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৩৩১17১8৮২/২ চেষ্টা করব ।
কুলমাইন্ড

3

@ ইস্কির শীর্ষস্থানীয় উত্তরটি ভাল, তবে কোডটি ব্যবহারের জন্য মার্জিত নয়, তাই আমি সাধারণ ব্যবহারের জন্য গ্রেডে একটি গ্রোভি স্ক্রিপ্ট লিখেছিলাম। এটি সমস্ত বিল্ড টাইপ এবং পণ্যগুলির স্বাদে প্রয়োগ করা হয় এবং এটি কেবল লেআউটের জন্যই ব্যবহার করা যায় না, আপনি যেমন আঁকো হিসাবে অন্য কোনও সংস্থার ধরণের জন্য সাবফোল্ডার যুক্ত করতে পারেন। এখানে কোডটি রয়েছে (এটি androidপ্রকল্পের স্তরের গ্রেডেল ফাইলের ব্লকে রেখে দিন) :

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, তারপর বিন্যাসের এক্সএমএল ফাইলটি রাখা উচিত res\layouts\activity\layout\xxx.xml

যদি আমি এর selectorsজন্য নামযুক্ত সাবফোল্ডার তৈরি করতে চাই drawable, resDirsযেমন ভেরিয়েবলের কোনও নামের সাথে একটি স্ট্রিং যুক্ত করতে পারি drawables, তবে অঙ্কনযোগ্য এক্সএমএল ফাইলটি .োকাতে হবে res\drawables\selectors\drawable\xxx.xml

ফোল্ডারের নাম যেমন layoutsএবং drawablesচলকতে সংজ্ঞায়িত হয় resDirs, এটি কোনও স্ট্রিং হতে পারে। সকল subfolder যেমন আপনি দ্বারা নির্মিত activityবা selectorsসমান হিসাবে গণ্য করা হয় resফোল্ডার। সুতরাং selectorsফোল্ডারে, আমাদের অবশ্যই drawableঅতিরিক্ত ফোল্ডার তৈরি করতে হবে এবং ফোল্ডারে এক্সএমএল ফাইলগুলি রাখতে হবে drawable, এর পরে গ্রেডল এক্সএমএল ফাইলগুলি সাধারণত অঙ্কনীয় হিসাবে সনাক্ত করতে পারে।


এই এক সঠিক উত্তর বিবেচনা করা উচিত! সহজ এবং পুরোপুরি কাজ!
গ্লিউসিও লিওনার্দো সান্টানা

2

আপনি যদি অনুমোদিত উত্তরে পদ্ধতিটি ব্যবহার করেন এবং কিছুটা উন্নতি করতে চান তবে গ্রেডের সেটিংটি এভাবে পরিবর্তন করুন:

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

সুতরাং আপনি যদি আরও ফোল্ডার এবং লেআউট যুক্ত করেন তবে আপনাকে এখানে ফিরে আসার দরকার নেই এবং উত্স ফোল্ডারগুলির একটি দীর্ঘ তালিকা সংযোজন করার দরকার নেই, গ্রেডেল আপনার জন্য সমস্ত ফোল্ডার আনুক।


1
  • পদক্ষেপ 1: লেআউটে ডান ক্লিক করুন - এক্সপ্লোরারটিতে দেখান
  • পদক্ষেপ 2: লেআউট ফোল্ডারটি খুলুন এবং সরাসরি সাবফোল্ডারগুলি তৈরি করুন: বিন্যাস_1, লেআউট_2 ...
  • পদক্ষেপ 3: ওপেন লেআউট_1 ফোল্ডার লেআউট তৈরি করুন (দ্রষ্টব্য: বাধ্যতামূলক নাম লেআউট), ওপেন লেআউট 2 ফোল্ডারটি লেআউট উপ-ডিরেক্টরি তৈরি করুন (নোট: বাধ্যতামূলক নাম লেআউট) ...
  • পদক্ষেপ 4: এক্সএমএল ফাইলগুলি লেআউট_1 এবং লেআউট 2 এর লেআউট সাব-ডিরেক্টরিতে অনুলিপি করুন
  • পদক্ষেপ 5: বিড.গ্রেড (মডিউল অ্যাপ্লিকেশন) এ কোডটি চালান এবং সিঙ্কটি এখনই হিট করুন:

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • পদক্ষেপ:: সংক্ষিপ্তসার: উপরের সমস্ত পদক্ষেপগুলি কেবল ক্লাস্টারিং ফোল্ডারগুলিতে সহায়তা করবে এবং 'প্রকল্প' মোডে প্রদর্শিত হবে, যখন 'অ্যান্ড্রয়েড' মোডটি স্বাভাবিক হিসাবে প্রদর্শিত হবে।
  • সুতরাং আমি আঁকছি যে সম্ভবত উপসর্গের নামকরণ ক্লাস্টারিং ফোল্ডারগুলির মতো কার্যকর।

Projectমোডের জন্য ধন্যবাদ । আমি বুঝতে পারি না সাবফোল্ডারগুলি কোথায় ( Androidমোডে) অদৃশ্য হয়ে গেছে ।
কুলমাইন্ড

0

আচ্ছা, সংক্ষিপ্ত উত্তরটি হ'ল না। তবে আপনার অবশ্যই একাধিক resফোল্ডার থাকতে পারে। এটি, আমার কাছে মনে হয়, আপনি layoutফোল্ডারের জন্য সাব- ফোল্ডারগুলি পেতে পারেন close এখানে কিভাবে আপনি এটা করবেন।


1
গৃহীত উত্তর চেক করুন। আমি ব্যক্তিগতভাবে এটি চেষ্টা করি নি তবে আপনি যদি চেক এবং আপডেট করতে পারেন তবে এটি সহায়ক হবে!
পরেশ মায়ানী 25'15

0

শীর্ষ উত্তরের কয়েকটি অসুবিধা রয়েছে: আপনাকে নতুন লেআউট পাথ যুক্ত করতে হবে, এএস এর 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-differences-folders-in-android-project/ । সাবফোল্ডারগুলি তৈরি করতে আপনার এই মেনুটি ব্যবহার করতে হবে: নতুন> ফোল্ডার> পুনরায় ফোল্ডার।

হালনাগাদ

কয়েক সপ্তাহ পরে আমি দেখতে পেলাম যে রিসোর্সে পরিবর্তনগুলি অ্যান্ড্রয়েড স্টুডিওর দ্বারা লক্ষ্য করা যায় না । সুতরাং, কিছু অদ্ভুত বাগ উপস্থিত হয়। উদাহরণস্বরূপ, লেআউটগুলি পুরানো আকার, মার্জিন প্রদর্শন করা চালিয়ে যায়। কখনও কখনও এএস নতুন এক্সএমএল-ফাইলগুলি খুঁজে পায় না (বিশেষত রান-টাইমের সময়)। কখনও কখনও এটি view idগুলি মিশে যায় (অন্য এক্সএমএল-ফাইলের উল্লেখ)। এটি প্রায়শই চাপতে হয় Build > Clean Projectবা Build > Rebuild Projectঅ্যান্ড্রয়েড স্টুডিওতে এক্সএমএল লেআউট ফাইলগুলি পরিবর্তন করার পরে পুনর্নির্মাণের প্রয়োজনীয় পড়ুন ।


আপনার মন্তব্য 'আমি এই নিবন্ধটির সাথে ফোল্ডার তৈরি করেছি (সংযুক্ত লিঙ্ক)' সুতরাং এখানে সমাধান সরবরাহ করার কোনও গ্রহণযোগ্য উপায় নয় আপনার উত্তর অস্পষ্ট। আপনি নির্দেশাবলী ছেড়ে যেতে পারেন এবং লিঙ্কের সাথে লেখককে ক্রেডিট করতে পারেন। অন্যথায়, এটি কেবল অলস।
জংলেদেব

@ জাঙ্গলেদেভ, ভাল, অবশেষে আমি এই ধারণাটি প্রত্যাখ্যান করে একটি traditionalতিহ্যবাহী resফোল্ডারে ফিরে এসেছি , কারণ এএস সম্পূর্ণরূপে ফোল্ডারে বিভক্ত সম্পদ সমর্থন করে না। সম্ভবত আমি এই উত্তরটি পরিবর্তন করব বা এমনকি মুছব। তবে আপনি কী বলতে চাইছেন যে এখানে এসও-তে সমাধান দেওয়ার কোনও গ্রহণযোগ্য উপায় নয়?
কুলমাইন্ড

আমি যা বলেছিলাম ঠিক তাই বলছি। 'এই টিউটোরিয়ালটি দিয়ে আমি এটি করেছি .... (লিঙ্কটি সন্নিবেশ করুন) বলবেন না।' আপনার যা বলা উচিত তা হ'ল: "আমি এই টিউটোরিয়ালটি অনুসরণ করেছি (লিঙ্কটি প্রবেশ করান) এবং এখানে আমার জন্য কাজ করা পদক্ষেপগুলি এখানে রয়েছে here পদক্ষেপ 1, পদক্ষেপ 2, পদক্ষেপ 3 ... ইত্যাদি 'আপনাকে উত্তরের এখানে পদক্ষেপগুলি অন্তর্ভুক্ত করতে হবে Simp সহজভাবে টিউটোরিয়ালের সাথে সংযোগ গ্রহণযোগ্য নয়
জাঙ্গলেদেব

0

উপ-ডিরেক্টরি (সহজে) থাকতে পারে না তবে আপনার অতিরিক্ত সংস্থান ফোল্ডার থাকতে পারে। অবাক হয়ে কারও ইতিমধ্যে এটি উল্লেখ করা হয়নি, তবে ডিফল্ট রিসোর্স ফোল্ডারগুলি রাখতে এবং আরও কিছু যুক্ত করতে:

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.