Android Layout klasörü alt klasörler içerebilir mi?


551

Şu anda, her xml mizanpaj dosyasını res/layoutklasörün içinde saklıyorum , bu yüzden küçük projeleri yönetmek mümkün ve basit, ancak büyük ve ağır projeler söz konusu olduğunda, içinde bir hiyerarşi ve alt klasörler olmalı düzen klasörü.

örneğin

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

Aynı şekilde, büyük uygulama için alt klasörlere sahip olmak istiyoruz, bu yüzden android projesinde bunu yapmanın herhangi bir yolu var mı?

Düzen klasörü içinde düzen kişisel ve layout_address alt klasörleri oluşturabiliyorum, ancak R.layout ._______ kullanarak xml düzen dosyasına erişme zamanı geldiğinde, o zaman içinde herhangi bir xml düzen pop-up'ı yok Menü.



Bu bağlantının size yardımcı olabileceğini düşünüyorum. blog.mindorks.com/…
Dilip Poudel

Yanıtlar:


475

Bunu gradle ile yapabilirsiniz. Nasıl olduğunu gösteren bir demo projesi yaptım .

Hile, gradle'ın birden çok kaynak klasörü birleştirmek ve res klasörü ile sourceSets bloğundaki iç içe geçmiş alt klasörleri ayarlamak için yeteneğini kullanmaktır .

Tuhaflık, klasörün alt kaynak klasörlerini bildirmeden önce bir kapsayıcı kaynak klasörü bildirememenizdir.

Aşağıda demodan build.gradle dosyasındaki sourceSets bloğu bulunmaktadır. İlk olarak alt klasörlerin bildirildiğine dikkat edin.

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

iç içe kaynaklar resim

Ayrıca, gerçek kaynak dosyalarınızın (png, xml düzenleri, vb.) Doğrudan üst öğesinin yine de belirtime uyması gerekir .


6
Bunu çekilebilir klasörlerle yapmak mümkün mü? Beyan sırasını bile dikkate alarak şanssız denedim.
trevor-e

7
Güzel! Sadece sınıfın kaynak klasörlerini birleştirme yeteneğinden gerçekten faydalandığınızı ve bunun mantıklı olacağını unutmayın.
eski

5
Klasördeki dosya adları hala benzersiz olmalı ve kodda örneğin klasörden veya klasörden R.layout.list_itemgeldiğini bilmelisiniz , bu nedenle düz adlandırma hala geçerlidir. moviescinemas
TWiStErRob

5
Ne yazık ki bu build:gradle:0.14.4ve ile benim için çalışmıyor buildToolsVersion "21.1.1".
Kamil Lelonek

32
Bu işe yarar , ancak cevap, eklediğiniz her alt klasörün içinde, yalnızca "düzen" olarak adlandırılabilecek ikinci bir alt klasör olması gerektiğini ve tüm düzen dosyalarınızın ikinci alt klasör (ler). Bunu çözmek için düzinelerce yorum okumak ideal olmaktan uzaktır. Ve hala arayan herkes için, ekstra "düzen" alt klasörlerinin ayarlanması URI is not registeredsorunun çözümüdür .
aroth

233

Cevap hayır.

İlginizi çeken bu Pro 2 Android kitabına dikkatinizi çekmek istiyorum :

Kaynaklarla ilgili birkaç kısıtlamaya dikkat etmek de önemlidir. İlk olarak, Android res altında önceden tanımlanmış klasörlerdeki dosyaların yalnızca doğrusal bir listesini destekler. Örneğin , düzen klasörü altındaki iç içe klasörleri (veya res altındaki diğer klasörleri) desteklemez.

İkincisi, varlıklar klasörü ve res altındaki ham klasör arasında bazı benzerlikler vardır. Her iki klasör de ham dosyalar içerebilir, ancak raw içindeki dosyalar kaynak olarak kabul edilir ve varlıklar içindeki dosyalar dikkate alınmaz.

Varlıklar klasörünün içeriği kaynak olarak değerlendirilmediğinden, içine klasörler ve dosyalar arasında rastgele bir hiyerarşi koyabileceğinizi unutmayın .


3
Bir sonraki en iyi umudum, dosya adı öneklerine göre dosyaları daraltabilecek bir Eclipse veya IntelliJ eklentisi olacak.
Jerry Brady

15
@ Justin, gradle için gönderdiğim çözüme göz atın.
eski

Bir çözüm dosyaları kategorize etmek istediğiniz gibi adlandırmak olabilir, bu yüzden alt klasörlerde gibi görünüyor. Adın başına bir "alt klasör etiketi" ekliyorum. Örneğin. tüm etkinlikler "activity_activityname.xml" ve bir alt etkinlik "activity_activityname_childactivity.xml" ve benzeri olabilir. Başka herhangi bir dosya "other_filename.xml" olur. Karışıklığı önlemek için yaptığım şey bu. Kahretsin, biri beni dövdü. Üç yıla kadar. <Kötüum, bunu görmemiştim.
Vedavyas Bhat

1
Burada, rawkaynakları göz önünde bulundurarak yoğunluk / yönelim / versiyon / vb. Bağımlı şeritleme elde ederken, assetsbunu elle yapmak zorunda olduğunuzu belirtmek önemlidir .
TWiStErRob

1
Bu cevabı Android ana akımını bulmaya karşı bir argüman olarak seçti.
Zon

77

Sadece eskilerin sorunlu insanlar için harika cevabını eklemek istedim. (Not: Bu, maalesef 'android' görünümü yerine yalnızca 'proje' görünümünde ayrı dizinler gibi çalışacak ve görünecektir.)

Aşağıdakiler ile test edilmiştir. BuildToolsVersion = 23.0.0 sınıf 1.2.3 ve 1.3.0

Zaten yapılmış bir projeyle çalışmak için benimkini bu şekilde aldım.

  1. Tüm XML dosyalarını mizanpaj dizininizden kopyalayın ve masaüstündeki bir dizine veya yedekleme için bir yere koyun.
  2. Tüm düzen dizinini silin (Her şeyi 1. adımdan yedeklediğinizden emin olun !!!)
  3. Res dizinine sağ tıklayın ve yeni> dizin seçin.
  4. Bu yeni dizini "düzenler" olarak adlandırın. (İstediğiniz her şey olabilir, ancak daha sonra gelen bir 'parça' dizini veya 'etkinlik' dizini olmayacaktır).
  5. Yeni "düzenler" dizinini sağ tıklayın ve yeni> dizin'i seçin. (Bu, içinde bulunan XML dosyalarının türünün adı olacaktır, örneğin 'fragmanlar' ve 'etkinlikler').
  6. 'Fragment' veya 'activities' dizinini sağ tıklayın (Not: bunun 'fragment' veya 'faaliyetler' olması gerekmez, sadece örnek olarak kullanıyorum) ve new> directory'i tekrar seçin ve bu dizini adlandırın "Yerleşim". (Not: Bu 'düzen' olarak adlandırılmalıdır !!! çok önemli).
  7. İstediğiniz XML dosyalarını masaüstünüzde yaptığınız yedeklemeden yeni 'düzen' dizinine yerleştirin.
  8. İstediğiniz sayıda özel dizin için 5 - 7 arasındaki adımları yineleyin.
  9. Bu tamamlandıktan sonra, modüllerinizin gradle.build dosyasına gidin ve böyle bir sourceSets tanımı oluşturun ... !! Aşağıda gösterdiğim gibi).

    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. Kâr $$$$

Ama cidden .. işte böyle çalıştım. Herhangi bir sorunuz varsa bana bildirin .. Yardım etmeye çalışabilirim.

Resimler kelimelerden daha değerlidir.

Dizin Yapısı


1
Peki gibi düzen dizinleri hakkında layout-v21?
Akshay Chordiya

4
Test etmedim, ama sadece düzen klasörlerinin yanında bir düzen-v21 klasörü oluşturduğunuzu hayal ediyorum.
hitch.united

Grad 2.0.0 ve buildToolsVersion 23.0.2 üzerinde çalışır! Yapılandırma değerinin 'src/main/res/layouts/content've bu yapılandırmanın yolunun'src/main/res/layouts/content/layout'
cwhsu


2
Bir süredir şanssızlık aradım, bu benim için işe yarayan tek çözüm. Görüntülerle böyle ayrıntılı bir cevap gönderdiğiniz için teşekkür ederiz!
Makine Kabilesi

53

Mümkün değil, ancak düzen klasörü ada göre sıralandı. Bu nedenle, düzen dosya adlarını paket adlarımın önüne ekliyorum. Örneğin, iki paket "satın alma" ve "oynama" için:

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

20

Android Studio için Android Dosya Gruplama eklentisini kullanıyorum.Alt klasör oluşturmanıza gerçekten izin vermez, ancak dosyalarınızı ve kaynaklarınızı farklı klasörlerde oldukları gibi GÖSTERİR. Ve tam da bunu istedim.

"Android Dosya Gruplaması" eklentisini şu şekilde yükleyebilirsiniz:

Pencereler:

Android Studio -> Dosya -> Ayarlar -> Eklentiler.

Mac:

Android Studio -> Android Studio Sekmesi (Sol Üst) -> Tercihler -> Eklentiler -> JetBrains Eklentisini Yükle ..

Mac için test edebildim ve eklentiyi arayamadım. Eklentiyi buradan indirdim ve Install plugin from diskyukarıdaki ayardan seçeneği kullandım .


Ayrıca bu eklentinin bağlantısını paylaşın!
Paresh Mayani

Bitti. Her neyse, Android Studio'da her zaman "Android Dosya Gruplaması" için arama yapabilirsiniz -> Dosya -> Ayarlar -> Eklentiler
Sharpe

3
eklenti "Android" görünümünde çalışmadı, sadece "Project" Görünümü: /
Hugo Gresse

18

Artık Android Studio ve Gradle ile projenizde birden çok kaynak klasörünüz olabilir. Yalnızca mizanpaj dosyalarınızı değil, her türlü kaynağı düzenlemenize izin verir.

Tam olarak bir alt klasör değildir, ancak uygulamanızın bazı bölümlerini ayırabilir.

Yapılandırma şu şekildedir:

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

Dokümanları kontrol edin .


2
Bu ayar altında bir düzende her değişiklik yaptığımda clean, uygulamanın uygulamaya yansıdığını görmek için her zaman bir yapmak zorunda olduğumu fark ettim .
Pawan Kumar

16

Bence bu sorunun en şık çözümü (alt klasörlere izin verilmez) dosya adlarını içine yerleştirmiş olacağınız klasörün adı ile başa çıkmak olduğunu düşünüyorum. Örneğin, bir Etkinlik, Parça veya yalnızca "yerler" adı verilen genel görünüm için bir grup düzeniniz varsa, bunun yerine places_my_layout_name ile başlamanız gerekir. En azından bu, onları IDE içinde daha kolay bulunabilecek şekilde düzenleme sorununu çözüyor. En müthiş çözüm değil, ama hiç yoktan iyidir.


16

Küçük problem

Bu sorunun üst cevabını takip ederek alt klasörlere ulaşabiliyorum .

Ancak, proje büyüdükçe, birçok alt klasörünüz olacaktır:

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'
            ]
    }
}

Büyük bir sorun değil, ama:

  • liste çok uzadıkça hoş değil.
  • app/build.gradleyeni bir klasör eklediğiniz her seferinde değişiklik yapmanız gerekir .

Gelişme

Bu yüzden tüm iç içe klasörleri almak için basit bir Groovy yöntemi yazdım:

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
}

Bu yöntemi, içindeki android {...}bloğun dışına yapıştırın app/build.gradle.


Nasıl kullanılır

Böyle bir yapı için:

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

Şöyle kullanın:

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

Böyle bir yapınız varsa:

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

Bunu şu şekilde kullanacaksınız:

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

açıklama

getLayoutList()a relative pathtartışma olarak alır . relative pathProjenin yerine bağlı olarak değişebilir. Bu nedenle, girdiğimizde "app/src/main/res/layouts/", tüm alt klasörlerin adını bir dizi olarak döndürür ve bu tam olarak aynı olacaktır:

            [
                    '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'
            ]

İşte anlayış için yorumların bulunduğu senaryo:

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
}

Umarım yardımcı olur!


Yaklaşımınızı kullandım ama faaliyette nasıl kullanılır? i yönetici adlı düzenleri klasöründe alt klasör oluşturdu ve ben aktivite ve kullanım setContentView(R.layout.Admin.admin_home .)Admin.admin_home çözüldüğünde admin_home düzeni vardır çözülmez
Asmaa Rashad

Bunu normal şekilde kullanabilmeniz gerekir R.layout.admin_home. Betiğin sizin için adları otomatik olarak alabilmesi gerekir. Çalıştırabilir misin?
Ben bir kurbağa ejderhayım

iyi çalışıyor ama bu çizgiyi değiştirdikten sonra array.push("src/main/res");hiç def res="src/main/res"; array.push(res);i itme gibi bir hata var çünkü gstring parametresini istemiyor Dize biri bana bunu düzenleyebilir bu hata buldu ziyade herhangi birine .eğer
Asmaa Rashad

1
Alt klasörlerdeki düzenler android ad alanını çözemez. Herhangi bir fikir ?
Jaguar

Bu satırları açıp // uncomment for debuggingçıkışların src/main/res/layouts/<your_layout_files>düzgün algılanıp algılanmadığını kontrol edebilir misiniz ?
Ben bir kurbağa ejderhasıyım

15

Şimdi kolayca " Android Dosya Gruplama " adlı JetBrains eklentisi ile yapabilirsiniz

bu bağlantıya göz at

Android Dosya Gruplaması

resim açıklamasını buraya girin


Sadece basit ad kuralı ile gruplandırmayı organize ettiği için doğru cevap olarak işaretlenmelidir. Sınıfın, hatta bir uygulamanın varsayılan dizin yapısının değiştirilmesine gerek yoktur. Tüm düzen hala yerleşim klasöründe kalır, ancak şu şekilde gruplanırAndroid Studio
Alireza Fattahi

1
Android görünümünde çalışmıyor çünkü kabul edilen cevap olmamalı .... (ama fikri seviyorum ^^)
Appyx

Bu android son son sürümü için çalışmıyor ... herhangi bir güncellenmiş sürümü var mı?
user3053247

7

Bunu yapmanın bir yolu, projenizdeki gerçek res klasörü ile aynı düzeyde ayrı bir res klasörü oluşturmaktı, o zaman bunu uygulama derlemenizde kullanabilirsiniz.

android {
    //other stuff

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

örnek klasör yapısı

yeni res klasörünüzün her bir alt klasörü, belirli bir ekranla veya uygulamanızdaki bir şeyle ilgili olabilir ve her klasör, şeyleri organize tutmak için kendi layout/ drawable/ valuesvb. cevaplar gerektirir (Sadece yeni bir kaynak klasörü eklediğinizde notunuzu senkronize edin, böylece onu bilir ve xml dosyalarınızı eklemeden önce ilgili alt klasörleri eklediğinizden emin olun).



3

Bir linux veya mac kutusu üzerinde geliştiriyorsanız, yerleşim dosyalarınıza sembolik bağlantılar içeren alt klasörler oluşturmak için bir geçici çözüm olacaktır. Ln komutunu -s ile kullanmanız yeterlidir

ln -s PATH_TO_YOUR_FILE

Buradaki sorun, Layout klasörünüzün hala tüm .xml dosyalarını içermesidir. Ancak alt klasörleri kullanarak bunları seçebilirsiniz. Sahip olmak istediğiniz şeye en yakın şey.

Vista veya daha yeni bir sürüm kullanıyorsanız, bunun Windows ile de çalışabileceğini okudum. Bu mklinkkomut var. Sadece google, hiç kullanmadım.

Başka bir sorun, dosyayı açıp tekrar açmayı denerseniz, eklenti bir NULL Pointer Exception atar. Ama telefonu kapatmıyor.


1
Bir symlink'i koymak, bileşenleri farklı alt dizinlere ayırarak depolamayı modüler hale getirme amacını ortadan kaldırır: daha az yerine daha karmaşık hale getirmek. Gradle, ek kaynak dizinlerinin teknik özelliklerine izin verir.
RichieHH

3

Birden çok kaynak kümesi için tüm öneriler işe yarayabilirken, sorun Android Studio Gradle eklentisi için geçerli mantığın iç içe kaynak kümeleri için değiştirildikten sonra kaynak dosyalarını güncellememesidir. Geçerli uygulama, startsWith () kullanarak kaynak dizinlerini kontrol etmeye çalışır, böylece iç içe geçmiş bir dizin yapısı (yani src / main / res / layout / düzenler ve src / main / res / layout / layouts_category2) src / main / res'i seçer. / layout / layouts sürekli olarak değişir ve değişiklikleri gerçekten güncellemez. Sonuç olarak, projeyi her seferinde yeniden yapılandırmanız / temizlemeniz gerekir.

Sorunları çözmeye yardımcı olmak için https://android-review.googlesource.com/#/c/157971/ adresinden bir yama gönderdim .


AS'nin XML dosyalarındaki değişiklikleri not etmediğini kabul ediyorum. Peki çözüm nedir? Stackoverflow.com/questions/32317822/… 'i deneyeceğim .
CoolMind

3

@Eski'nin en iyi yanıtı iyi, ama kodun kullanımı zarif değil, bu yüzden genel kullanım için sınıfta harika bir senaryo yazdım. Tüm yapı tipi ve ürün aromasına uygulanır ve sadece düzen için kullanılabilir, aynı zamanda çekilebilir gibi diğer kaynak türleri için alt klasör de ekleyebilirsiniz. Kod ( androidproje düzeyinde not dosyası bloğuna koyun ) :

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]
}

Pratikte nasıl yapılır?

Örneğin, ben adlandırılmış alt klasörü oluşturmak istediğiniz activityiçin layout, herhangi bir isimle bir dize eklemek resDirsgibi değişken layoutssonra düzen xml dosyası konulmalıdır, res\layouts\activity\layout\xxx.xml.

Ben adında alt klasörü oluşturmak istiyorsanız selectorsiçin drawable, herhangi bir isimle bir dize eklemek resDirsgibi değişken drawablesardından çekilebilir xml dosyası konulmalıdır, res\drawables\selectors\drawable\xxx.xml.

Değişken içinde layoutsve gibi klasör adı drawablestanımlanır resDirs, herhangi bir dize olabilir. Sizin tarafınızdan oluşturulan activityveya gibi oluşturulan tüm alt klasörler klasörle selectorsaynı kabul edilir res. Bu nedenle, selectorsklasörde drawableek olarak klasör oluşturmalı ve xml dosyalarını drawableklasöre koymalıyız , daha sonra gradle xml dosyalarını normal olarak çekilebilir olarak tanıyabilir.


Bu doğru cevap olarak düşünülmelidir! Basit ve mükemmel çalışıyor!
Gláucio Leonardo Sant'ana

2

Yöntemi onaylanmış yanıtta kullanırsanız ve biraz iyileştirmek istiyorsanız, not ayarını şu şekilde değiştirin:

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

Bu nedenle, daha fazla klasör ve düzen eklerseniz, buraya geri dönmeniz ve kaynak klasörlerin uzun bir listesini eklemeniz gerekmez, gradle'ın tüm klasörleri sizin için almasına izin verin.


1
  • Adım 1: Düzeni sağ tıklayın - Explorer'da gösterin
  • 2. Adım: Düzen klasörünü açın ve doğrudan alt klasörleri oluşturun: layout_1, layout_2 ...
  • Adım 3: layout_1 dosyasını açın klasör düzeni oluşturun (not: zorunlu ad mizanpajdır), layout_2 klasörünü açın mizanpaj alt dizini oluşturun (not: zorunlu isim mizanpajdır) ...
  • Adım 4: XML dosyalarını layout_1 ve layout_2'deki düzen alt dizinlerine kopyalayın
  • Adım 5: Kodu buid.grade'de (modül uygulaması) çalıştırın ve şimdi senkronize et'e basın:

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • Adım 6: Özet: Yukarıdaki tüm adımlar klasörlerin kümelenmesine ve 'proje' modunda görüntülenmesine yardımcı olurken, 'android' modu normal olarak görüntülenecektir.
  • Bu yüzden belki de önek adlarının kümeleme klasörleri kadar etkili olduğunu çiziyorum.

ProjectMod için teşekkürler . Alt klasörlerin nerede kaybolduğunu anlayamadım ( Androidmodda).
CoolMind

0

Kısa cevap hayır. Ama kesinlikle birden fazla resklasörünüz olabilir. Bu, bence, klasör için alt klasörlere sahip olabileceğiniz kadar yakın layout. İşte böyle yapıyorsun.


1
Kabul edilen cevabı kontrol edin. Şahsen denemedim ama kontrol edip güncelleyebiliyorsanız yardımcı olur!
Paresh Mayani

0

En iyi yanıtların birkaç dezavantajı vardır: AS yeni düzen yolları eklemeniz gerekir, AS yeni kaynakları res\layoutsklasöre yerleştirir res\values.

Birkaç cevabı birleştirerek benzer yazdım:

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

Bu makaleyle klasörler yaptım: http://alexzh.com/tutorials/how-to-store-layouts-in-different-folders-in-android-project/ . Alt klasörler oluşturmak için şu menüyü kullanmanız gerekir: Yeni> Klasör> Klasörü Res.

GÜNCELLEME

Birkaç hafta sonra , kaynaklardaki değişikliklerin Android Studio tarafından fark edilmediğini fark ettim . Yani, bazı garip hatalar ortaya çıkıyor. Örneğin, düzenler eski boyutları ve kenar boşluklarını göstermeye devam eder. Bazen AS yeni XML dosyaları bulamaz (özellikle çalışma zamanında). Bazen view ids'yi karıştırır (başka bir XML dosyasına referanslar). Genellikle Build > Clean Projectveya tuşuna basmak gerekir Build > Rebuild Project. Android Studio'da xml mizanpaj dosyalarını değiştirdikten sonra gerekli Yeniden Oluşturma bölümünü okuyun .


'Bu makaleyle klasör ekledim (ekli bağlantı)' yorumunuz, SO üzerinde çözümler sunmak için kabul edilebilir bir yol değildir. Cevabınız belirsiz. Talimatları bırakabilir ve yazara bir link verebilirsiniz. Aksi takdirde, bu sadece tembel.
jungledev

@jungledev, nihayet bu fikri reddettim ve geleneksel bir resklasöre geri döndüm , çünkü AS kaynakları klasörlere bölmeyi tam olarak desteklemiyor. Muhtemelen bu cevabı değiştireceğim, hatta sileceğim. Peki, burada SO'ya çözüm sağlamanın kabul edilebilir bir yolu olmadığını söylerken ne demek istiyorsun?
CoolMind

Demek istediğim tam olarak. 'Bu eğitimde yaptım .... (link ekle)' demeyin. Söylemeniz gerekenler: "Bu öğreticiyi izledim (bağlantı ekle) ve işte benim için çalışan adımlar. Adım 1, Adım 2, Adım 3 ... vb 'Cevabı BURAYA adımları eklemeniz gerekiyor. bir öğreticiye bağlantı kabul edilemez.
jungledev

0

Alt dizinler olamaz (kolayca), ancak ek kaynak klasörleriniz olabilir. Hiç kimse bundan bahsetmedi, ancak varsayılan kaynak klasörlerini korumak ve biraz daha eklemek için:

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.