Android SDKのドキュメントでは、@ drawable/my_image xml構文で使用されているすべての例は、私のプロジェクトのres/drawableディレクトリに格納されている画像を直接扱っています。
Drawableディレクトリ内にサブディレクトリを作成しても大丈夫ではないかと思います。
たとえば、次のようなディレクトリレイアウトがあるとします。
res/drawable
-- sandwiches
-- tunaOnRye.png
-- hamAndSwiss.png
-- drinks
-- coldOne.png
-- hotTea.png
ツナサラダのサンドイッチのイメージを@ drawable/sandwiches/tunaOnRyeとして参照できますか。
または、描画可能ディレクトリ内で階層をフラットに保つ必要がありますか。
いいえ、リソースメカニズムはdrawableディレクトリ内のサブフォルダをサポートしていないので、そうです - その階層をフラットに保つ必要があります。
ここに示したディレクトリレイアウトでは、どの画像も使用できません。
私自身の実験によると、res/drawable
フォルダー内に任意の項目を含むサブフォルダーがあると、リソースコンパイラーが失敗し、R.Java
ファイルが正しく生成されなくなります。
私が使用している(そしてAndroid自体が好むように思われる)回避策は、基本的にスラッシュをアンダースコアに置き換えることです。そのため、あなたの構造は次のようになります。
sandwich_tunaOnRye.png
sandwich_hamAndSwiss.png
drink_coldOne.png
drink_hotTea.png
アプローチはあなたがあなたの命名に細心の注意を払うことを必要とし、ファイル自体をまとめることをそれほど簡単にはしません(あなたが飲み物とサンドイッチが本当にすべて "food
"であるべきと決心した場合それらをディレクトリに移動するだけです。しかし、あなたのプログラミングロジックの複雑さは損なわれないあまりにもフォルダ構造の同等物と比較してひどく。
この状況は実に不幸です。 Androidは素晴らしいと決定的なデザインの決定の混合袋です。私たちはすべての正当な急ぎで雑草を取り除くために後者の部分についてだけ望むことができます:)
はい - それは吸いません:)しかし、あなたはアセットフォルダを使用してそこにサブディレクトリを持ってそのように画像をロードすることができます。
資産フォルダーを使用します。
サンプルコード:
InputStream is = null;
try {
is = this.getResources().getAssets().open("test/sample.png");
} catch (IOException e) {
;
}
image = BitmapFactory.decodeStream(is);
ファイル名を2つのアンダースコア__
で区切ることによって仮想サブフォルダーを作成することを可能にするEclipseプラグインを書きました。プロジェクトは初期段階にありますが、IDEがクラッシュすることはありませんのでご安心ください。
より多くの詳細はここで見つけることができます、フォークしてプルリクエストを送ってください:
Gradle付きのAndroidスタジオでは、リソースを分けることができる複数のソースディレクターを持つことができます。例えば:
Android {
....
Android.sourceSets {
main.res.srcDirs = ['src/main/extraresdirnamed_sandwiches', 'src/main/res']
}
....
}
しかし、名前が衝突してはいけません。つまり、sandwiches_tunaOnRyeのような名前を付ける必要がありますが、すべてのサンドイッチについて別々のセクションを持つことができます。
これにより、リソースをさまざまな構造に格納することができます(actionbargeneratorなどの自動生成コンテンツに役立ちます)。
私は簡単なスクリプトを使用して、デザイナーによって提供された組織的なディレクトリ構造を、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
この問題を部分的に回避する1つの方法は、APIレベルのサフィックスを使用することです。私はres/layout-v1、res/layout-v2などを使って同じapkに複数のサブプロジェクトを入れます。このメカニズムはすべてのリソースタイプに使用できます。
明らかに、これはres/layout-vより上のAPIレベルをターゲットにしている場合にのみ使用できます。あなたが使っている.
また、Android 1.5と1.6のバグにも注意してください。 APIレベルの接尾辞についてはAndoroidのドキュメントを参照 。
図書館システムの出現で、大きな資産のセットごとに図書館を作ることが解決策になるかもしれません。
すべてのアセット内で同じ名前を使用しないようにしなければならないため、それでも問題がありますが、ライブラリごとにプレフィックススキームを使用するとうまくいくはずです。
フォルダを作成することができるほど単純ではありませんが、それは物事を健全に保つのに役立ちます...
この状況には回避策があります。たとえば、デフォルトのresVector
フォルダと同じレベルにres
フォルダを作成できます。そこでdrawable-xxx
リソースフォルダーを追加できます。
resVector
-drawable
-layout
-color
その後必要なのは追加することだけです
sourceSets {
main.res.srcDirs += 'src/main/resVector'
}
あなたのbuild.gradle
ファイル(Android { }
の中)に入れてください。
Android StudioのGradleはこのようにすることができます( link )。
「構造の設定」の段落にあります
sourceSets {
main {
Java {
srcDir 'src/Java'
}
resources {
srcDir 'src/resources'
}
}
}
メインにフォルダを作成します。 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'
}
}
}
私の話ではありませんが、私がこの問題を探しているときにこのスレッドを見つけました。
これは完璧な方法ではありません。 display here と同じ方法で実装する必要があります。
あなたが使用することができるコードを介してフォルダの下の画像を呼び出すこともできます
Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.gradient_box);
TextView tv = (TextView)findViewByID(R.id.textview);
tv.setBackground(shape);
#!/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?("/")
}
assets /生のアセットファイルを保存するのに使えます。ここで保存したファイルはそのまま.apkファイルにコンパイルされ、元のファイル名が保持されます。 URIを使って典型的なファイルシステムと同じ方法でこのディレクトリをナビゲートし、AssetManagerを使ってバイトのストリームとしてファイルを読むことができます。たとえば、これはテクスチャやゲームデータに適した場所です。 http://developer.Android.com/tools/projects/index.html
フォルダ階層を単一のフォルダに変換するチェック Bash Flatten Folderスクリプト
サブディレクトリは許可されていません。リソースには[a-z0-9_。]のみを含める必要があります。
いいえ、大文字、スラッシュはありません。