607

現在、すべての XML レイアウト ファイルを「res/layout」フォルダー内に保存しているため、小規模なプロジェクトを管理するのは実行可能で簡単ですが、大規模で重いプロジェクトの場合は、階層化して管理する必要があります。レイアウト フォルダー内に必要なサブフォルダー。

例えば

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

同じように、大きなアプリケーション用のサブフォルダーを作成したいのですが、Android プロジェクト内でそれを行う方法はありますか?

layout フォルダー内に layout-personal および layout_address サブフォルダーを作成することはできますが、R.layout.________ を使用して XML レイアウト ファイルにアクセスするときが来たら、その時点で内部に XML レイアウト ポップアップはありません。メニュー。

4

20 に答える 20

244

答えはノーだ。

この本Pro Android 2に注意を向けたいと思います:

リソースに関するいくつかの制約にも注意する必要があります。まず、Android は res の下の定義済みフォルダー内のファイルの線形リストのみをサポートします。たとえば 、layout フォルダー(または res の下の他のフォルダー) の下にネストされたフォルダーはサポートされません。

第 2 に、ress の下の assets フォルダーと raw フォルダーにはいくつかの類似点があります。どちらのフォルダーにも raw ファイルを含めることができますが、raw 内のファイルはリソースと見なされ、アセット内のファイルはそうではありません。

assetsフォルダーの内容はリソースとは見なされないため、その中にフォルダーとファイルの任意の階層を配置できることに注意してください 。

于 2011-02-08T07:17:04.853 に答える
89

問題を抱えている人々に対するeskisの素晴らしい回答に追加したかっただけです。(注: これは、残念ながら「android」ビューではなく、「project」ビュー内の個別のディレクトリのように機能し、見えます。)

以下でテスト済み。BuildToolsVersion = 23.0.0 グラドル 1.2.3 & 1.3.0

これが、私がすでに構築されたプロジェクトで動作するようになった方法です。

  1. レイアウト ディレクトリからすべての XML ファイルをコピーし、それらをデスクトップ上のディレクトリまたはバックアップ用のディレクトリに配置します。
  2. レイアウト ディレクトリ全体を削除します (ステップ 1 からすべてをバックアップしたことを確認してください!!!)。
  3. res ディレクトリを右クリックし、[新規] > [ディレクトリ] を選択します。
  4. この新しいディレクトリに「layouts」という名前を付けます。(これは好きなように指定できますが、「フラグメント」ディレクトリや「アクティビティ」ディレクトリにはなりません。後で追加します)。
  5. 新しい "layouts" ディレクトリを右クリックし、[新規] > [ディレクトリ] を選択します。(これは、「フラグメント」や「アクティビティ」など、その中にある XML ファイルのタイプの名前になります)。
  6. 「フラグメント」または「アクティビティ」ディレクトリを右クリックし (注: これは、例として使用している「フラグメント」または「アクティビティ」である必要はありません)、[新規] > [ディレクトリ] をもう一度選択し、このディレクトリに名前を付けます。 "レイアウト"。(注:これは「レイアウト」と名付けなければなりません!!!非常に重要です)。
  7. デスクトップに作成したバックアップから、必要な XML ファイルを新しい「layout」ディレクトリ内に配置します。
  8. 必要な数のカスタム ディレクトリに対して、手順 5 ~ 7 を繰り返します。
  9. これが完了したら、モジュールの gradle.build ファイルに移動し、次のような sourceSets 定義を作成します... (「src/main/res/layouts」と「src/main/res」が常に下の 2 つであることを確認してください!! !! 以下に示すように)。

    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. 利益$$$$

しかし、真剣に..これが私がそれを機能させる方法です。ご不明な点がございましたら、お気軽にお問い合わせください。

写真は言葉よりも価値があります。

ディレクトリ構造

于 2015-08-25T03:12:16.397 に答える
56

できませんが、レイアウト フォルダは名前順にソートされます。そのため、レイアウト ファイル名の前にパッケージ名を追加します。たとえば、「購入」と「再生」の 2 つのパッケージの場合:

buying_bought_tracks.xml
buying_buy_tracks.xml
playing_edit_playlist.xml
playing_play_playlist.xml
playing_show_playlists.xml
于 2011-10-21T23:19:48.273 に答える
20

この問題に対する最も洗練された解決策は (サブフォルダーが許可されていないことを考えると)、ファイル名の前に、それを配置するフォルダーの名前を追加することだと思います。たとえば、Activity、Fragment、または「places」と呼ばれる一般的なビューのレイアウトがたくさんある場合は、places_my_layout_name を先頭に追加する必要があります。少なくとも、これにより、IDE 内で見つけやすい方法でそれらを整理するという問題が解決されます。これは最も優れたソリューションではありませんが、何もしないよりはましです。

于 2012-06-05T02:41:37.887 に答える
18

小さな問題

この質問に対するトップの回答に従うことで、サブフォルダーを作成できます。

ただし、プロジェクトが大きくなるにつれて、多くのサブフォルダーが作成されます。

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新しいフォルダを追加するたびに変更する必要があります。

改善

そこで、ネストされたすべてのフォルダーを取得するための単純な Groovy メソッドを作成しました。

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
}

それが役に立てば幸い!

于 2016-04-29T06:40:49.590 に答える
18

Android Studio と Gradle を使用すると、プロジェクトに複数のリソース フォルダーを含めることができます。レイアウト ファイルだけでなく、あらゆる種類のリソースを整理できます。

これは厳密にはサブフォルダーではありませんが、アプリケーションの一部を分離する場合があります。

構成は次のようになります。

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

ドキュメントを確認してください。

于 2014-02-04T13:38:24.180 に答える
4

承認された回答でメソッドを使用し、それを少し改善したい場合は、gradle 設定を次のように変更します。

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

したがって、フォルダーとレイアウトをさらに追加する場合は、ここに戻ってソース フォルダーの長いリストを追加する必要はありません。gradle にすべてのフォルダーを取得させてください。

于 2018-06-22T08:41:57.760 に答える
3

Linux または Mac ボックスで開発している場合、回避策は、レイアウト ファイルへのシンボリック リンクを含むサブフォルダーを作成することです。-s を指定して ln コマンドを使用するだけです

ln -s PATH_TO_YOUR_FILE

これに関する問題は、Layout フォルダーにまだすべての .xml ファイルが含まれていることです。ただし、サブフォルダーを使用してそれらを選択することはできます。それはあなたが望むものに最も近いものです。

Vista以降を使用している場合、これはWindowsでも機能する可能性があることを読んだところです。このmklinkコマンドがあります。グーグルで検索してください。自分で使用したことはありません。

もう 1 つの問題は、ファイルを開いた状態で再度開こうとすると、プラグインが NULL ポインター例外をスローすることです。しかし、ハングアップしません。

于 2011-02-08T07:42:21.930 に答える
3

複数のリソース セットのすべての提案が機能する可能性がありますが、ネストされたリソース セットに対してリソース ファイルが変更された後、Android Studio Gradle プラグインの現在のロジックではリソース ファイルが更新されないという問題があります。現在の実装では、startsWith() を使用してリソース ディレクトリをチェックしようとするため、ネストされたディレクトリ構造 (つまり、src/main/res/layout/layouts および src/main/res/layout/layouts_category2) は src/main/res を選択します。 /layout/layouts を一貫して使用し、実際に変更を更新することはありません。その結果、毎回プロジェクトを再構築/クリーンアップする必要があります。

問題を解決するために 、 https://android-review.googlesource.com/#/c/157971/にパッチを送信しました。

于 2015-07-02T14:24:13.840 に答える