Introdução
Parecido com o ideal do uso de uma instância da classe Resources, um objeto AssetManager é usado para capturar e carregar em tempo de execução itens da pasta assets, enquanto o objeto Resources faz o mesmo com itens da pasta resources.
Outra semelhança entre os dois é a forma de capturar, enquanto capturarmos um objeto de Resources em nossa Activity através do método getResources() herdado da classe ContentWrapper, temos o método getAssets() herdado da mesma classe pela Activity que nos retornará um objeto AssetManager.
Sendo assim, vamos elaborar um exemplo da captura de um objeto AssetManager.
class MyActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
AssetManager assets = getAssets();
}
}
Carregando uma imagem
Geralmente, dentro da pasta assets inserimos imagens para serem usadas dentro de nosso app. Associá-la a um ImagemView de dentro do xml é simples, como segue abaixo
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:id=“@+id/main”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_orientation= “vertical” >
<ImageView android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:id=“@+id/myImage”
android:src=“@drawable/myImage”/>
</LinearLayout>
Mas e se precisássemos fazer tudo isso em tempo de execução, ou seja, e se precisamos fazer isso de dentro de uma activity? Para isso temos o nosso objeto AssetManager e seu método open(String) que aguarda como parâmetro o caminho de onde está a imagem à partir da pasta asset. Vamos imaginar que nossa imagem está na pasta “assets/smallimages/MyImage”, que na verdade só indicaremos à partir da pasta asset, e ao passarmos ela ao método, ele retornará um objeto InputStream como pode ser visto no exemplo abaixo.
class MyActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
AssetManager assets = getAssets();
InputStream inputStream;
try {
inputStream = assets.open(“smallimages/MyImage.png”);
} catch (IOException e) {
Log.e(“ERROR”, “Error loading the imagem”, e);
}
}
}
Feito isso, precisamos agora transformar esse Stream em um Drawable através do método estático da classe Drawable, createFromStream(Stream, String). Passaremos a esse método nosso objeto InputStream e como segundo parâmetro um nome.
class MyActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
AssetManager assets = getAssets();
InputStream inputStream;
try {
inputStream = assets(“smallimages/MyImage.png”);
Drawable drawable = Drawable.createFromStream(inputStream);
} catch (IOException e) {
Log.e(“ERROR”, “Error loading the imagem”, e);
}
}
}
Então, para finalizar passamos esse objeto drawable ao método setImageDrawable(Drawable) do nosso objeto ImageView que referencia ao nosso elemento no xml.
class MyActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
AssetManager assets = getAssets();
InputStream inputStream;
try {
inputStream = assets(“smallimages/MyImage.png”);
Drawable drawable = Drawable.createFromStream(inputStream);
ImageView imageView = (ImageView) findViewById(R.id.myImage);
imageView.setImageDrawable(drawable);
} catch (IOException e) {
Log.e(“ERROR”, “Error loading the imagem”, e);
}
}