Ich versuche, ein Bild aus dem Ordner asset
zu laden und es auf eine ImageView
zu setzen. Ich weiß, dass es viel besser ist, wenn ich den R.id.*
dafür verwende, aber die Prämisse ist, dass ich die ID des Bildes nicht kenne. Grundsätzlich versuche ich, das Bild über den Dateinamen dynamisch zu laden.
Ich rufe zum Beispiel zufällig ein Element in der Variable database
ab, sagen wir eine 'cow'. Nun würde meine Anwendung nun ein Bild einer 'cow' über die ImageView
anzeigen. Dies gilt auch für alle Elemente in der database
. (Die Annahme ist, für jedes Element gibt es ein äquivalentes Bild)
danke im Voraus.
EDIT
habe die Frage vergessen, wie ich das Bild aus dem Ordner asset
lade?
Wenn Sie den Dateinamen im Code kennen, ist das Aufrufen kein Problem:
ImageView iw= (ImageView)findViewById(R.id.imageView1);
int resID = getResources().getIdentifier(drawableName, "drawable", getPackageName());
iw.setImageResource(resID);
Ihr Dateiname hat denselben Namen wie drawableName, so dass Sie sich nicht mit Assets beschäftigen müssen.
Überprüfen Sie diesen Code . In diesem Tutorial erfahren Sie, wie Sie ein Bild aus dem Asset-Ordner laden.
// Bild laden
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;
}
Hier sind Sie ja,
public Bitmap getBitmapFromAssets(String fileName) {
AssetManager assetManager = getAssets();
InputStream istr = assetManager.open(fileName);
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}
Einige dieser Antworten können die Frage beantworten, aber ich mochte keine von ihnen, also habe ich am Ende dieses Dokuments geschrieben, es ist meine Hilfe für die Community.
Bitmap
von Assets abrufen:
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
von Assets abrufen:
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);
Dies funktionierte in meinem Anwendungsfall:
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
}
(Siehe auch 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;
}
Laut Android Developer Documentation kann das Laden mit Bitmap die Leistung der App beeinträchtigen ein Link ! Also schlägt das Dokument vor, die Bibliothek Glide zu verwenden.
Wenn Sie ein Bild aus dem Assets-Ordner laden möchten , verwenden Sie die Bibliothekshilfe Glide Sie viel einfacher.
füge einfach Abhängigkeiten zu build.gradle (Modul: app) von https://github.com/bumptech/glide hinzu
dependencies {
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}
beispielbeispiel:
// 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);
}
Falls obige Methode nicht funktioniert: Ersetzen Sie this object durch view object from below code (nur wenn Sie die Inflate-Methode wie unten in Ihrem Code angewendet haben).
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.book,parent,false);