asset
フォルダーから画像をロードして、ImageView
に設定しようとしています。このためにR.id.*
を使用する方がはるかに良いことはわかっていますが、前提は画像のIDがわからないことです。基本的に、ファイル名を使用して画像を動的にロードしようとしています。
たとえば、 'cow'を表すdatabase
内の要素をランダムに取得します。 ImageView
を介して 'cow'の画像を表示します。これは、database
のすべての要素にも当てはまります。 (仮定は、すべての要素に同等の画像があることです)
前もって感謝します。
[〜#〜] edit [〜#〜]
質問を忘れた場合、asset
フォルダーから画像を読み込むにはどうすればよいですか?
コード内のファイル名がわかっている場合、これを呼び出しても問題はありません。
ImageView iw= (ImageView)findViewById(R.id.imageView1);
int resID = getResources().getIdentifier(drawableName, "drawable", getPackageName());
iw.setImageResource(resID);
ファイル名はdrawableNameと同じ名前になるため、アセットを扱う必要はありません。
これをチェックアウト code 。このチュートリアルでは、アセットフォルダーから画像を読み込む方法を見つけることができます。
//画像を読み込みます
try
{
// get input stream
InputStream ims = getAssets().open("avatar.jpg");
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
mImage.setImageDrawable(d);
ims .close();
}
catch(IOException ex)
{
return;
}
はい、どうぞ、
public Bitmap getBitmapFromAssets(String fileName) {
AssetManager assetManager = getAssets();
InputStream istr = assetManager.open(fileName);
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}
これらの答えのいくつかは質問に答えるかもしれませんが、私はそれらのどれも好きではなかったので、私はこれを書くことになりました、それはコミュニティを助けます。
アセットからBitmap
を取得します。
public Bitmap loadBitmapFromAssets(Context context, String path)
{
InputStream stream = null;
try
{
stream = context.getAssets().open(path);
return BitmapFactory.decodeStream(stream);
}
catch (Exception ignored) {} finally
{
try
{
if(stream != null)
{
stream.close();
}
} catch (Exception ignored) {}
}
return null;
}
アセットからDrawable
を取得します。
public Drawable loadDrawableFromAssets(Context context, String path)
{
InputStream stream = null;
try
{
stream = context.getAssets().open(path);
return Drawable.createFromStream(stream, null);
}
catch (Exception ignored) {} finally
{
try
{
if(stream != null)
{
stream.close();
}
} catch (Exception ignored) {}
}
return null;
}
WebView web = (WebView) findViewById(R.id.webView);
web.loadUrl("file:///Android_asset/pract_recommend_section1_pic2.png");
web.getSettings().setBuiltInZoomControls(true);
これは私のユースケースでうまくいきました:
AssetManager assetManager = getAssets();
ImageView imageView = (ImageView) findViewById(R.id.imageView);
try (
//declaration of inputStream in try-with-resources statement will automatically close inputStream
// ==> no explicit inputStream.close() in additional block finally {...} necessary
InputStream inputStream = assetManager.open("products/product001.jpg")
) {
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
} catch (IOException ex) {
//ignored
}
( https://javarevisited.blogspot.com/2014/10/right-way-to-close-inputstream-file-resource-in-Java.html も参照)
public static Bitmap getImageFromAssetsFile(Context mContext, String fileName) {
Bitmap image = null;
AssetManager am = mContext.getResources().getAssets();
try {
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
Android Developer Documentationによると、bitmapでロードすると、アプリのパフォーマンスが低下する可能性があります。 リンク !したがって、docはGlideライブラリを使用することを提案します。
アセットフォルダから画像をロードしたい場合、Glideライブラリヘルプを使用簡単にできます。
https://github.com/bumptech/glide からbuild.gradle(Module:app)に依存関係を追加するだけです
dependencies {
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}
サンプル例:
// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
...
ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this).load("file:///Android_asset/img/fruit/cherries.jpg").into(imageView);
}
上記の方法で動作しない場合:thisオブジェクトを以下のコードのviewオブジェクトに置き換えます(Inflateメソッドが適用されている場合のみ以下のコードで)。
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.book,parent,false);