Thư mục Bố cục Android có thể chứa các thư mục con không?


551

Ngay bây giờ, tôi đang lưu trữ mọi tệp bố cục xml bên trong res/layoutthư mục, vì vậy việc quản lý các dự án nhỏ là khả thi và đơn giản, nhưng khi có một dự án lớn và nặng, thì cần có một hệ thống phân cấp và thư mục con cần thiết bên trong thư mục bố trí.

ví dụ

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

Giống như cách tương tự, chúng tôi muốn có các thư mục con cho ứng dụng lớn, vậy có cách nào để làm như vậy trong dự án Android không?

Tôi có thể tạo các thư mục con layout-Personal và layout_address bên trong thư mục layout, nhưng khi đến lúc truy cập tệp bố cục xml bằng R.layout ._____, tại thời điểm đó không có bất kỳ bố cục xml nào xuất hiện bên trong thực đơn.



Tôi nghĩ rằng liên kết này có thể giúp bạn chi tiết. blog.mindork.com/ từ
Dilip Poudel

Câu trả lời:


475

Bạn CÓ THỂ làm điều này với gradle. Tôi đã thực hiện một dự án demo cho thấy làm thế nào.

Mẹo nhỏ là sử dụng khả năng của lớp để hợp nhất nhiều thư mục tài nguyên và đặt thư mục res cũng như các thư mục con lồng nhau trong khối sourceSets.

Điều khó hiểu là bạn không thể khai báo một thư mục tài nguyên container trước khi bạn khai báo các thư mục tài nguyên con của thư mục đó.

Dưới đây là khối sourceSets từ tệp build.gradle từ bản demo. Lưu ý rằng các thư mục con được khai báo đầu tiên.

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

hình ảnh tài nguyên lồng nhau

Ngoài ra, cha mẹ trực tiếp của các tệp tài nguyên thực tế của bạn (pngs, bố trí xml, v.v.) vẫn cần phải tương ứng với đặc tả .


6
Có thể làm điều này với các thư mục drawable? Tôi chỉ cố gắng không có may mắn, thậm chí có tính đến việc khai báo.
trevor-e

7
Đẹp! Chỉ cần nhớ rằng bạn thực sự chỉ khai thác khả năng của lớp để hợp nhất các thư mục tài nguyên và nó sẽ có ý nghĩa.
eski

5
Tên tệp trong thư mục vẫn phải là duy nhất và trong mã bạn phải biết rằng ví dụ: R.layout.list_itemđến từ movieshoặc cinemasthư mục, vì vậy việc đặt tên phẳng vẫn được áp dụng.
TWiStErRob

5
Thật không may, điều đó không làm việc cho tôi với build:gradle:0.14.4buildToolsVersion "21.1.1".
Kamil Lelonek

32
Tác phẩm này, tuy nhiên câu trả lời thực hiện một woefully công việc không đầy đủ giải thích rằng mỗi thư mục con mà bạn thêm nhu cầu phải có một thứ hai bên trong thư mục con của nó, mà chỉ có thể được gọi là "bố trí", và tất cả các file layout của bạn cần phải đi bên trong thư mục con thứ hai . Đọc qua hàng tá ý kiến ​​để làm việc đó là xa lý tưởng. Và đối với bất cứ ai vẫn đang tìm kiếm, thiết lập các thư mục con "bố trí" bổ sung là giải pháp cho URI is not registeredvấn đề.
vào

233

Câu trả lời là không.

Tôi muốn thu hút sự chú ý của bạn đối với cuốn sách Pro Android 2 này có ghi:

Nó cũng đáng lưu ý một vài hạn chế liên quan đến tài nguyên. Đầu tiên, Android chỉ hỗ trợ một danh sách các tệp trong các thư mục được xác định trước dưới độ phân giải. Ví dụ, nó không hỗ trợ các thư mục lồng nhau trong thư mục bố trí (hoặc các thư mục khác dưới độ phân giải).

Thứ hai, có một số điểm tương đồng giữa thư mục tài sản và thư mục thô dưới độ phân giải. Cả hai thư mục có thể chứa các tệp thô, nhưng các tệp trong raw được coi là tài nguyên và các tệp trong tài sản thì không.

Lưu ý rằng vì nội dung của thư mục tài sản không được coi là tài nguyên, bạn có thể đặt cấu trúc phân cấp tùy ý của các thư mục và tệp trong đó.


3
Tôi mời khách hy vọng tốt nhất tiếp theo của chúng tôi sẽ là một plugin Eclipse hoặc IntelliJ có thể thu gọn các tệp dựa trên tiền tố tên tệp.
Jerry Brady

15
@Justin kiểm tra giải pháp tôi đã đăng cho lớp.
eski

Tôi đoán một giải pháp có thể là đặt tên cho các tệp theo cách bạn muốn chúng được phân loại, vì vậy có vẻ như nó nằm trong các thư mục con. Tôi thêm một "thẻ thư mục con" vào đầu tên. Ví dụ. tất cả các hoạt động sẽ là "Activity_activityname.xml" và một hoạt động con có thể là "Activity_activityname_childactivity.xml", v.v. Bất kỳ tệp nào khác sẽ là "other_filename.xml". Đó là những gì tôi làm để tránh nhầm lẫn. Chết tiệt, có người đánh tôi với nó. Bởi ba năm>. <Xấu của tôi, đã không thấy điều đó.
Vedirlas Bhat

1
Điều quan trọng cần lưu ý ở đây là bằng cách xem xét rawnhư các tài nguyên bạn có được phân chia phụ thuộc mật độ / định hướng / phiên bản / vv, trong khi với assetsbạn phải làm điều đó bằng tay.
TWiStErRob

1
Chọn câu trả lời này như là một lập luận chống lại việc tìm ra dòng chính của Android.
Zon

77

Tôi chỉ muốn thêm vào câu trả lời tuyệt vời của eskis cho những người gặp rắc rối. (Lưu ý: Điều này sẽ chỉ hoạt động và trông giống như các thư mục riêng biệt trong chế độ xem 'dự án', không phải là chế độ xem 'android'.)

Đã thử nghiệm với những điều sau đây. BuildToolsVersion = 23.0.0 lớp 1.2.3 & 1.3.0

Đây là cách tôi có được của tôi để làm việc với một dự án đã được xây dựng.

  1. Sao chép tất cả các tệp XML ra khỏi thư mục bố trí của bạn và đặt chúng vào một thư mục trên màn hình nền hoặc một cái gì đó để sao lưu.
  2. Xóa toàn bộ thư mục bố cục (Đảm bảo bạn đã sao lưu mọi thứ từ bước 1 !!!)
  3. Nhấp chuột phải vào thư mục res và chọn thư mục mới>.
  4. Đặt tên cho thư mục mới này là "bố cục". (Đây có thể là bất cứ điều gì bạn muốn, nhưng nó sẽ không phải là thư mục 'đoạn' hoặc thư mục 'hoạt động', sẽ đến sau).
  5. Nhấp chuột phải vào thư mục "bố cục" mới và chọn thư mục mới>. (Đây sẽ là tên của loại tệp XML mà bạn sẽ có trong đó, ví dụ: 'các đoạn' và 'hoạt động').
  6. Nhấp chuột phải vào thư mục 'đoạn' hoặc 'hoạt động' (Lưu ý: đây không phải là 'đoạn' hoặc 'hoạt động', đó chỉ là những gì tôi đang sử dụng làm ví dụ) và chọn thư mục mới> một lần nữa và đặt tên cho thư mục này "bố trí". (Lưu ý: Điều này PHẢI được đặt tên là 'bố cục' !!! rất quan trọng).
  7. Đặt các tệp XML bạn muốn trong thư mục 'layout' mới từ bản sao lưu bạn đã tạo trên máy tính để bàn của mình.
  8. Lặp lại các bước 5 - 7 cho bao nhiêu thư mục tùy chỉnh mà bạn muốn.
  9. Khi điều này hoàn tất, hãy đi vào tệp gradle.build của mô-đun của bạn và tạo định nghĩa sourceSets như thế này ... (Đảm bảo 'src / main / res / layouts' & 'src / main / res' luôn là hai phần dưới cùng !! !! Giống như tôi đang hiển thị bên dưới).

    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. Lợi nhuận $$$$

Nhưng nghiêm túc .. đây là cách tôi làm cho nó hoạt động. Hãy cho tôi biết nếu có ai có bất kỳ câu hỏi nào .. Tôi có thể cố gắng giúp đỡ.

Hình ảnh có giá trị hơn lời nói.

Cấu trúc thư mục


1
Những gì về thư mục bố trí như layout-v21?
Akshay Chordiya

4
Tôi chưa kiểm tra nó, nhưng tôi sẽ tưởng tượng bạn chỉ cần tạo một thư mục layout-v21 dọc theo các thư mục layout.
quá giang.united

Hoạt động trên lớp 2.0.0 và buildToolsVersion 23.0.2! Lưu ý rằng giá trị cấu hình là 'src/main/res/layouts/content'và đường dẫn của cấu hình này là'src/main/res/layouts/content/layout'
cwhsu

3
Tôi đang gặp vấn đề với stackoverflow.com/questions/41934004/
Petra Barus

2
Tìm kiếm một lúc không có may mắn, đây là giải pháp duy nhất hiệu quả với tôi. Cảm ơn đã gửi một câu trả lời chi tiết với hình ảnh!
Bộ lạc máy

53

Không thể, nhưng thư mục bố trí được sắp xếp theo tên. Vì vậy, tôi đặt trước tên tệp bố cục với tên gói của tôi. Ví dụ: hai gói "mua" và "chơi":

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

20

Tôi sử dụng Nhóm tệp Android plugin cho Android Studio. Nó thực sự không cho phép bạn tạo các thư mục con, nhưng nó có thể HIỂN THỊ các tệp và tài nguyên của bạn NHƯ chúng nằm trong các thư mục khác nhau. Và đây là chính xác những gì tôi muốn.

Bạn có thể cài đặt plugin "Nhóm tệp Android" bằng cách

Các cửa sổ:

Android Studio -> Tệp -> Cài đặt -> Plugin.

Mac:

Android Studio -> Tab Android Studio (Trên cùng bên trái) -> Tùy chọn -> Plugin -> Cài đặt Plugin JetBrains ..

Đối với Mac, tôi đã có thể kiểm tra nó và không thể tìm kiếm plugin. Vì vậy, tôi đã tải xuống plugin từ đây và sử dụng Install plugin from disktùy chọn từ cài đặt ở trên.


Cũng chia sẻ liên kết của plugin đó!
Paresh Mayani

Làm xong. Dù sao, bạn luôn có thể tìm kiếm "Nhóm tệp Android" trong Android Studio -> Tệp -> Cài đặt -> Plugin
Sharpe

3
plugin không hoạt động trên chế độ xem "Android", chỉ có chế độ xem "Dự án": /
Hugo Gresse

18

Giờ đây với Android Studio và Gradle, bạn có thể có nhiều thư mục tài nguyên trong dự án của mình. Cho phép tổ chức không chỉ các tệp bố cục của bạn mà bất kỳ loại tài nguyên nào.

Nó không chính xác là một thư mục con, nhưng có thể tách các phần trong ứng dụng của bạn.

Cấu hình như thế này:

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

Kiểm tra tài liệu .


2
Tôi nhận thấy rằng mỗi khi tôi thực hiện thay đổi bố cục trong cài đặt này, tôi luôn phải thực hiện cleanđể xem nó được phản ánh trên ứng dụng.
Pawan Kumar

16

Tôi nghĩ rằng giải pháp tinh tế nhất cho vấn đề này (cho rằng các thư mục con không được phép) là thêm vào tên tệp với tên của thư mục mà bạn sẽ đặt nó bên trong. Ví dụ: nếu bạn có một loạt các bố cục cho một Hoạt động, Đoạn hoặc chỉ là chế độ xem chung được gọi là "địa điểm" thì bạn chỉ nên đặt trước nó với địa điểm_my_layout_name. Ít nhất điều này giải quyết vấn đề tổ chức chúng theo cách mà chúng dễ tìm thấy hơn trong IDE. Nó không phải là giải pháp tuyệt vời nhất, nhưng tốt hơn là không có gì.


16

Vấn đề nhỏ

Tôi có thể đạt được các thư mục con bằng cách làm theo câu trả lời hàng đầu cho câu hỏi này.

Tuy nhiên, khi dự án phát triển lớn hơn, bạn sẽ có nhiều thư mục con:

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

Không phải là một vấn đề lớn, nhưng:

  • Nó không đẹp khi danh sách trở nên rất dài.
  • bạn phải thay đổi app/build.gradlemỗi khi bạn thêm một thư mục mới.

Cải thiện

Vì vậy, tôi đã viết một phương thức Groovy đơn giản để lấy tất cả các thư mục lồng nhau:

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
}

Dán phương pháp này bên ngoài android {...}khối trong của bạn app/build.gradle.


Cách sử dụng

Đối với một cấu trúc như thế này:

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

Sử dụng nó như thế này:

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

Nếu bạn có một cấu trúc như thế này:

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

Bạn sẽ sử dụng nó như thế này:

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

Giải trình

getLayoutList()lấy a relative pathlàm đối số. Điều relative pathnày có liên quan đến gốc của dự án. Vì vậy, khi chúng ta nhập vào "app/src/main/res/layouts/", nó sẽ trả về tất cả tên của các thư mục con dưới dạng một mảng, sẽ giống hệt như:

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

Đây là kịch bản có ý kiến ​​để hiểu:

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
}

Hy vọng nó giúp!


Tôi đã sử dụng phương pháp của bạn nhưng làm thế nào để sử dụng nó trong hoạt động? tôi đã tạo thư mục con trong thư mục bố trí được gọi là admin và nó có bố cục setContentView(R.layout.Admin.admin_home .)admin_home khi tôi đang hoạt động và sử dụng Admin.admin_home không được giải quyết
Asmaa Rashad

Bạn sẽ có thể sử dụng nó bình thường, như thế R.layout.admin_home. Kịch bản sẽ có thể tự động chọn tên cho bạn. Hãy cho tôi biết nếu bạn có thể làm cho nó hoạt động.
Tôi là rồng ếch

nó hoạt động tốt nhưng sau khi thay đổi dòng này array.push("src/main/res");thành def res="src/main/res"; array.push(res);vì tôi gặp lỗi vì đẩy muốn tham số G chuỗi chứ không phải Chuỗi một. Nếu bất kỳ ai thay vì tôi thấy lỗi này, bạn có thể chỉnh sửa nó
Asmaa Rashad

1
Bố cục trong các thư mục con không thể giải quyết không gian tên Android. Có ý kiến ​​gì không?
Jaguar

Bạn có thể bỏ ghi chú những dòng // uncomment for debuggingđó và sau đó kiểm tra xem các đầu ra src/main/res/layouts/<your_layout_files>có được phát hiện đúng không?
Tôi là một con rồng ếch

15

Bây giờ chúng ta có thể dễ dàng thực hiện với plugin JetBrains có tên là " Nhóm tệp Android "

kiểm tra liên kết này

Nhóm tệp Android

nhập mô tả hình ảnh ở đây


Phải được đánh dấu là câu trả lời đúng, vì chỉ tổ chức nhóm với quy ước tên đơn giản. Không cần thay đổi lớp, hoặc thậm chí cấu trúc thư mục mặc định của ứng dụng. Tất cả bố cục vẫn còn trong thư mục bố trí nhưng được nhóm lạiAndroid Studio
Alireza Fattahi

1
Không nên là câu trả lời được chấp nhận vì nó không hoạt động trong chế độ xem Android .... (nhưng tôi thích ý tưởng này ^^)
Appyx

Điều này không hoạt động cho phiên bản cuối cùng của Android ... có phiên bản cập nhật nào không?
dùng3053247

7

Một cách tôi đã làm là tạo một thư mục res riêng biệt ở cùng cấp độ với thư mục res thực tế trong dự án của bạn, sau đó bạn có thể sử dụng điều này trong ứng dụng build.gradle

android {
    //other stuff

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

cấu trúc thư mục ví dụ

sau đó mỗi thư mục con của thư mục res mới của bạn có thể là một cái gì đó liên quan đến từng màn hình cụ thể hoặc một cái gì đó trong ứng dụng của bạn và mỗi thư mục sẽ có layout/ drawable/ valuesetc giữ cho mọi thứ được sắp xếp và bạn không phải cập nhật tệp gradle theo cách thủ công như một số khác câu trả lời yêu cầu (Chỉ cần đồng bộ hóa lớp của bạn mỗi khi bạn thêm một thư mục tài nguyên mới để nó biết về nó và đảm bảo thêm các thư mục con có liên quan trước khi thêm các tệp xml của bạn).


4

Kiểm tra Bash Flatten Script script chuyển đổi phân cấp thư mục thành một thư mục


Sẽ kiểm tra nó sớm. Cảm ơn
Paresh Mayani

1
Kịch bản lệnh đó thay đổi tên tệp để bao gồm phân cấp thư mục trong tên tệp. Làm thế nào điều đó sẽ làm việc với IDE Android của bạn với tên tệp thay đổi ở mọi nơi?
Rabbi tàng hình

3

Nếu bạn đang phát triển trên linux hoặc hộp mac, một cách giải quyết sẽ là, để tạo các thư mục con bao gồm các liên kết tượng trưng đến các tệp bố cục của bạn. Chỉ cần sử dụng lệnh ln với -s

ln -s PATH_TO_YOUR_FILE

Vấn đề với điều này là, thư mục Bố cục của bạn vẫn chứa tất cả các tệp .xml. Nhưng bạn có thể chọn chúng bằng cách sử dụng các thư mục con. Đó là điều gần gũi nhất với những gì bạn muốn có.

Tôi vừa đọc, rằng điều này cũng có thể hoạt động với Windows, nếu bạn đang sử dụng Vista trở lên. Có mklinklệnh này . Chỉ cần google nó, chưa bao giờ sử dụng nó cho mình.

Một vấn đề khác là, nếu bạn đã mở tệp và cố gắng mở lại thì plugin sẽ ném ngoại lệ con trỏ NULL. Nhưng nó không treo lên.


1
Đặt một liên kết tượng trưng để đánh bại mục đích muốn mô đun hóa lưu trữ bằng cách tách các thành phần thành các thư mục con khác nhau: làm cho nó phức tạp hơn thay vì ít hơn. Gradle cho phép các thông số kỹ thuật của các thư mục tài nguyên bổ sung.
RichieHH

3

Mặc dù tất cả các đề xuất cho nhiều bộ tài nguyên có thể hoạt động, vấn đề là logic hiện tại cho trình cắm Android Studio Gradle sẽ không cập nhật các tệp tài nguyên sau khi chúng đã thay đổi cho các bộ tài nguyên lồng nhau. Việc triển khai hiện tại cố gắng kiểm tra các thư mục tài nguyên bằng cách sử dụng startedWith (), do đó, cấu trúc thư mục được lồng (ví dụ: src / main / res / layout / layout và src / main / res / layout / layouts_carget2) sẽ chọn src / main / res / layout / layout một cách nhất quán và không bao giờ thực sự cập nhật các thay đổi. Kết quả cuối cùng là bạn phải xây dựng lại / làm sạch dự án mỗi lần.

Tôi đã gửi một bản vá tại https://android-review.googlesource.com/#/c/157971/ để cố gắng giúp giải quyết mọi việc.


Tôi đồng ý với bạn rằng AS không lưu ý các thay đổi trong tệp XML. Nhưng giải pháp là gì? Tôi sẽ thử stackoverflow.com/questions/32317822/ .
CoolMind

3

Câu trả lời hàng đầu của @eski là tốt, nhưng mã không thanh lịch để sử dụng, vì vậy tôi đã viết một tập lệnh Groovy trong lớp để sử dụng chung. Nó được áp dụng cho tất cả các loại sản phẩm và hương vị sản phẩm và không chỉ có thể được sử dụng để bố trí, bạn cũng có thể thêm thư mục con cho bất kỳ loại tài nguyên nào khác, chẳng hạn như drawable. Đây là mã (đặt nó vàoandroid khối tệp lớp cấp dự án)

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

Làm thế nào để làm trong thực tế?

Ví dụ: tôi muốn tạo thư mục con được đặt tên activitycho layout, thêm một chuỗi theo bất kỳ tên nào trongresDirs biến như layouts, sau đó nên đặt tệp xml bố cụcres\layouts\activity\layout\xxx.xml .

Nếu tôi muốn tạo thư mục con được đặt tên selectorscho drawable, hãy thêm một chuỗi theo bất kỳ tên nào trong resDirsbiến, chẳng hạn nhưdrawables tệp xml có thể vẽ được nên được đặt vào res\drawables\selectors\drawable\xxx.xml.

Tên thư mục như layoutsdrawablesđược định nghĩa trong resDirsbiến, nó có thể là bất kỳ chuỗi nào. Tất cả các thư mục con được tạo bởi bạn như activityhoặc selectorsđược coi là giống như resthư mục. Vì vậy, trong selectorsthư mục, chúng ta phải tạo drawablethêm thư mục và đặt các tệp xml vào drawablethư mục, sau đó lớp đó có thể nhận ra các tệp xml là có thể vẽ được bình thường.


Điều này nên được coi là câu trả lời chính xác! Đơn giản và làm việc hoàn hảo!
Gláucio Leonardo Sant'ana

2

Nếu bạn sử dụng phương pháp trong câu trả lời được phê duyệt và muốn cải thiện nó một chút, thì hãy thay đổi cài đặt lớp như sau:

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

Vì vậy, nếu bạn thêm nhiều thư mục và bố cục, bạn không cần phải quay lại đây và nối thêm một danh sách dài các thư mục nguồn, hãy để gradle lấy tất cả các thư mục cho bạn.


1
  • Bước 1: Nhấp chuột phải vào bố cục - hiển thị trong explorer
  • Bước 2: Mở thư mục layout và tạo các thư mục con trực tiếp: layout_1, layout_2 ...
  • Bước 3: mở layout_1 tạo bố cục thư mục (lưu ý: tên bắt buộc là bố cục), mở thư mục layout_2 tạo thư mục con bố cục (lưu ý: tên bắt buộc là bố cục) ...
  • Bước 4: Sao chép các tệp xml vào các thư mục con bố cục trong layout_1 và layout_2
  • Bước 5: Chạy mã trong buid.THER (ứng dụng mô-đun) và nhấn đồng bộ hóa ngay bây giờ:

sourceSets {
    main {
        res.srcDirs =
            [
                'src / main / res / layout / layout_1'
                'src / main / res / layout / layout_2',
                'src / main / res'
            ]
    }
}
  • Bước 6: Tóm tắt: Tất cả các bước trên sẽ chỉ giúp phân cụm các thư mục và hiển thị ở chế độ 'dự án', trong khi chế độ 'android' sẽ hiển thị như bình thường.
  • Vì vậy, tôi rút ra rằng có thể đặt tên tiền tố cũng hiệu quả như các thư mục phân cụm.

Cảm ơn Projectchế độ. Tôi không thể hiểu nơi các thư mục con biến mất (trong Androidchế độ).
CoolMind

0

Vâng, câu trả lời ngắn gọn là không. Nhưng bạn chắc chắn có thể có nhiều resthư mục. Điều đó, tôi nghĩ là gần như bạn có thể có các thư mục con cho layoutthư mục. Đây là cách bạn làm điều đó.


1
Kiểm tra câu trả lời được chấp nhận. Tôi đã không thử cá nhân nhưng nếu bạn có thể kiểm tra và cập nhật thì nó sẽ hữu ích!
Paresh Mayani

0

Câu trả lời hàng đầu có một số nhược điểm: bạn phải thêm đường dẫn bố cục mới, NHƯ đặt tài nguyên mới vào res\layoutsthư mục thay vìres\values .

Kết hợp một số câu trả lời tôi đã viết tương tự:

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

Tôi đã tạo các thư mục với bài viết này: http://alexzh.com/tutorials/how-to-store-layouts-in-different- Folders-in- android-project / . Để tạo thư mục con, bạn nên sử dụng menu này: Mới> Thư mục> Thư mục Res.

CẬP NHẬT

Sau một vài tuần, tôi thấy rằng những thay đổi về tài nguyên không được Android Studio chú ý . Vì vậy, một số lỗi kỳ lạ xuất hiện. Chẳng hạn, bố cục tiếp tục hiển thị kích thước cũ, lề. Đôi khi AS không tìm thấy các tệp XML mới (đặc biệt là trong thời gian chạy). Đôi khi, nó trộn view ids (tham chiếu đến tệp XML khác). Nó thường được yêu cầu để nhấn Build > Clean Projecthoặc Build > Rebuild Project. Đọc Rebuild cần thiết sau khi thay đổi tệp bố cục xml trong Android Studio .


Nhận xét của bạn 'Tôi đã tạo các thư mục với bài viết này (liên kết đính kèm)' không phải là cách chấp nhận được để cung cấp giải pháp ở đây trên SO Câu trả lời của bạn rất mơ hồ. Bạn có thể để lại hướng dẫn và ghi có tác giả với một liên kết. Nếu không, đây chỉ là lười biếng.
jungledev

@jungledev, cuối cùng, tôi đã từ chối ý tưởng này và quay lại resthư mục truyền thống , vì AS không hỗ trợ đầy đủ việc phân chia tài nguyên thành các thư mục. Có lẽ tôi sẽ thay đổi câu trả lời này hoặc thậm chí xóa. Nhưng ý bạn là gì khi nói rằng đó không phải là một cách chấp nhận được để cung cấp giải pháp ở đây trên SO?
CoolMind

Ý tôi là chính xác những gì tôi nói. Đừng nói 'Tôi đã làm nó với hướng dẫn này .... (chèn liên kết).' Điều bạn nên nói là: "Tôi đã làm theo hướng dẫn này (chèn liên kết) và đây là các bước làm việc cho tôi. Bước 1, Bước 2, Bước 3 ... vv 'Bạn cần bao gồm các bước TẠI ĐÂY trong câu trả lời. liên kết đến một hướng dẫn là không thể chấp nhận.
jungledev

0

Không thể có thư mục con (dễ dàng) nhưng bạn có thể có các thư mục tài nguyên bổ sung . Ngạc nhiên là không có ai đề cập đến nó, nhưng để giữ các thư mục tài nguyên mặc định và thêm một số:

    sourceSets {
        main.res.srcDirs += ['src/main/java/XYZ/ABC']
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.