web-dev-qa-db-ja.com

Androidのドロアブルディレクトリにサブディレクトリを含めることはできますか?

Android SDKのドキュメントでは、@ drawable/my_image xml構文で使用されているすべての例は、私のプロジェクトのres/drawableディレクトリに格納されている画像を直接扱っています。

Drawableディレクトリ内にサブディレクトリを作成しても大丈夫ではないかと思います。

たとえば、次のようなディレクトリレイアウトがあるとします。

res/drawable
-- sandwiches
  -- tunaOnRye.png
  -- hamAndSwiss.png
-- drinks
  -- coldOne.png
  -- hotTea.png

ツナサラダのサンドイッチのイメージを@ drawable/sandwiches/tunaOnRyeとして参照できますか。

または、描画可能ディレクトリ内で階層をフラットに保つ必要がありますか。

461

いいえ、リソースメカニズムはdrawableディレクトリ内のサブフォルダをサポートしていないので、そうです - その階層をフラットに保つ必要があります。

ここに示したディレクトリレイアウトでは、どの画像も使用できません。

私自身の実験によると、res/drawableフォルダー内に任意の項目を含むサブフォルダーがあると、リソースコンパイラーが失敗し、R.Javaファイルが正しく生成されなくなります。

507
Reto Meier

私が使用している(そしてAndroid自体が好むように思われる)回避策は、基本的にスラッシュをアンダースコアに置き換えることです。そのため、あなたの構造は次のようになります。

sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png

アプローチはあなたがあなたの命名に細心の注意を払うことを必要とし、ファイル自体をまとめることをそれほど簡単にはしません(あなたが飲み物とサンドイッチが本当にすべて "food"であるべきと決心した場合それらをディレクトリに移動するだけです。しかし、あなたのプログラミングロジックの複雑さは損なわれないあまりにもフォルダ構造の同等物と比較してひどく。

この状況は実に不幸です。 Androidは素晴らしいと決定的なデザインの決定の混合袋です。私たちはすべての正当な急ぎで雑草を取り除くために後者の部分についてだけ望むことができます:)

147
Cheezmeister

はい - それは吸いません:)しかし、あなたはアセットフォルダを使用してそこにサブディレクトリを持ってそのように画像をロードすることができます。

33
dijipiji

実際、Android Studioでは可能です。表示されているようにネストされたリソースを持つことができます ここで

enter image description here

リソースをグループ化するためのプラグインもあります ここ

32

資産フォルダーを使用します。

サンプルコード:

InputStream is = null;
try {
    is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
    ;
}

image = BitmapFactory.decodeStream(is);
22
milkia

ファイル名を2つのアンダースコア__で区切ることによって仮想サブフォルダーを作成することを可能にするEclipseプラグインを書きました。プロジェクトは初期段階にありますが、IDEがクラッシュすることはありませんのでご安心ください。

より多くの詳細はここで見つけることができます、フォークしてプルリクエストを送ってください:

https://github.com/kirill578/Android-Sorted-Res-Folder

enter image description here

20
Kirill Kulakov

Gradle付きのAndroidスタジオでは、リソースを分けることができる複数のソースディレクターを持つことができます。例えば:

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

しかし、名前が衝突してはいけません。つまり、sandwiches_tunaOnRyeのような名前を付ける必要がありますが、すべてのサンドイッチについて別々のセクションを持つことができます。

これにより、リソースをさまざまな構造に格納することができます(actionbargeneratorなどの自動生成コンテンツに役立ちます)。

9
Alec Holmes

私は簡単なスクリプトを使用して、デザイナーによって提供された組織的なディレクトリ構造を、Rファイルを生成するために使用できるものに平坦化するのが好きです。

Drawable-hdpiで現在のパスで実行します。

#! /bin/bash
DIRS=`find * -type d`
for dir in ${DIRS} ; do 
  for file in `ls ${dir}` ; do
    mv ${dir}/${file}  ${dir}_${file};
  done 
  rmdir ${dir};
done
9
Rene

この問題を部分的に回避する1つの方法は、APIレベルのサフィックスを使用することです。私はres/layout-v1、res/layout-v2などを使って同じapkに複数のサブプロジェクトを入れます。このメカニズムはすべてのリソースタイプに使用できます。

明らかに、これはres/layout-vより上のAPIレベルをターゲットにしている場合にのみ使用できます。あなたが使っている.

また、Android 1.5と1.6のバグにも注意してください。 APIレベルの接尾辞についてはAndoroidのドキュメントを参照

4
OferR

図書館システムの出現で、大きな資産のセットごとに図書館を作ることが解決策になるかもしれません。

すべてのアセット内で同じ名前を使用しないようにしなければならないため、それでも問題がありますが、ライブラリごとにプレフィックススキームを使用するとうまくいくはずです。

フォルダを作成することができるほど単純ではありませんが、それは物事を健全に保つのに役立ちます...

3
shi

この状況には回避策があります。たとえば、デフォルトのresVectorフォルダと同じレベルにresフォルダを作成できます。そこでdrawable-xxxリソースフォルダーを追加できます。

resVector
-drawable
-layout
-color

その後必要なのは追加することだけです

sourceSets {
        main.res.srcDirs += 'src/main/resVector'
    }

あなたのbuild.gradleファイル(Android { }の中)に入れてください。

2

Android StudioのGradleはこのようにすることができます( link )。

「構造の設定」の段落にあります

sourceSets {
 main {
    Java {
        srcDir 'src/Java'
    }
    resources {
        srcDir 'src/resources'
    }
 }
}
1
user3290180

メインにフォルダを作成します。 like: 'res_notification_btn'

そして 'drawable'や 'layout'のようにツリーフォルダを作成します。

それから「build.gradle」でこれを追加

sourceSets
            {
                main
                {
                    res
                    {
                        srcDirs = ['src/main/res_notification_btn', 'src/main/res']
                      or
                        srcDir 'src/main/res_notification_btn'
                    }
                }
            }
1
Ali Bagheri

私の話ではありませんが、私がこの問題を探しているときにこのスレッドを見つけました。

https://stackoverflow.com/a/22426467/618419

1
Captnwalker1

これは完璧な方法ではありません。 display here と同じ方法で実装する必要があります。

あなたが使用することができるコードを介してフォルダの下の画像を呼び出すこともできます

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);

TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
1
user3177928
#!/usr/bin/env Ruby

# current dir should be drawable-hdpi/ etc

# nuke all symlinks
Dir.foreach('.') {|f|
    File.delete(f) if File.symlink?(f)
}

# symlink all resources renaming with underscores
Dir.glob("**/*.png") {|f|
    system "ln -s #{f} #{f.gsub('/', '_')}" if f.include?("/")
}
0
Blake Miller

assets /生のアセットファイルを保存するのに使えます。ここで保存したファイルはそのまま.apkファイルにコンパイルされ、元のファイル名が保持されます。 URIを使って典型的なファイルシステムと同じ方法でこのディレクトリをナビゲートし、AssetManagerを使ってバイトのストリームとしてファイルを読むことができます。たとえば、これはテクスチャやゲームデータに適した場所です。 http://developer.Android.com/tools/projects/index.html

0
Alex M

フォルダ階層を単一のフォルダに変換するチェック Bash Flatten Folderスクリプト

0
Sneg

サブディレクトリは許可されていません。リソースには[a-z0-9_。]のみを含める必要があります。

いいえ、大文字、スラッシュはありません。

0
Ferhat Aslan