Usando setImageDrawable dinamicamente para definir a imagem em um ImageView

120

Estou gerando uma string dinamicamente do banco de dados que tem o mesmo nome de imagem na drawablepasta.

Agora eu quero definir esse valor para ImageViewusar setImageDrawable(R.id.StringGenerated)dinamicamente.

Alguma sugestão..

Uma corrida
fonte
significa que você está gerando ID da imagem dinamicamente, certo?
Paresh Mayani

Respostas:

195

Tente isso,

int id = getResources().getIdentifier("yourpackagename:drawable/" + StringGenerated, null, null);

Isso retornará o ID do drawable que você deseja acessar ... então você pode definir a imagem na visualização de imagem fazendo o seguinte

imageview.setImageResource(id);
King RV
fonte
Graças a ton..i encontrados em outro lugar bt ainda obrigado por seus esforços .. :)
Arun
12
No entanto, o uso de setImageResource () "faz a leitura e decodificação de bitmap no thread da interface do usuário, o que pode causar um problema de latência ... considere usar setImageDrawable () ou setImageBitmap ()." (Documentação Android)
chetto
6
Você também pode obter o ID simplesmente usando: R.drawable.filemane
Artur
102
Drawable image = ImageOperations(context,ed.toString(),"image.jpg");
            ImageView imgView = new ImageView(context);
            imgView = (ImageView)findViewById(R.id.image1);
            imgView.setImageDrawable(image);

ou

setImageDrawable(getResources().getDrawable(R.drawable.icon));
NikhilReddy
fonte
ele disse que está gerando uma string do banco de dados dinamicamente com o mesmo nome de imagem.
Paresh Mayani,
3
getDrawable (R.drawable.icon) é desaconselhado
Daryn
Para as pessoas que precisam de resolver getDrawable (R.drawable.icon) é obsoleto, tente ler este link para que
Codingpan
77

Pessoalmente, prefiro usar o método setImageResource()como este.

ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);
jlopez
fonte
1
este vence porque você pode alterar a imagem de qualquer lugar do código em que não tenha contexto para chamar o método getResources (). por exemplo, em adaptadores. Não há necessidade de passar o contexto através do construtor apenas para esta funcionalidade.
Phatee P
1
maneira mais limpa. Não entendo por que essa não é a resposta preferida.
Benjamin Basmaci
@BenjaminBasmaci Isso faz leitura e decodificação de Bitmap no thread da interface do usuário, o que pode causar um soluço de latência. Se isso for um problema, considere usar setImageDrawable (android.graphics.drawable.Drawable) ou setImageBitmap (android.graphics.Bitmap) e BitmapFactory. (Da documentação do Android)
Tayyab Mazhar
25

Os nomes desenháveis ​​de recursos não são armazenados como seqüências de caracteres, portanto, você precisará resolver a sequência na constante inteira gerada durante a construção. Você pode usar a Resourcesclasse para resolver a seqüência de caracteres nesse número inteiro.

Resources res = getResources();
int resourceId = res.getIdentifier(
   generatedString, "drawable", getPackageName() );
imageView.setImageResource( resourceId );

Isso resolve a string gerada no número inteiro que ImageViewpode ser usado para carregar a imagem correta.

Como alternativa, você pode usar o ID para carregar Drawablemanualmente e, em seguida, definir a imagem usando esse drawable em vez do ID do recurso.

Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );
Greyson
fonte
@Greyson ... Nice one sir..thatz o que eu estou procurando for..Thanks muito .. :)
Arun
13

Tão simples quanto esta resposta:

Drawable myDrawable = getResources().getDrawable(R.drawable.pic);
imageview.setImageDrawable(myDrawable);
Ahmad Arslan
fonte
8

Isso funciona, pelo menos na API Android 15

ImageView = imgv;
Resources res = getResources(); // need this to fetch the drawable
Drawable draw = res.getDrawable( R.drawable.image_name_in_drawable );
imgv.setImageDrawable(draw);

Você pode usar setImageResource (), mas a documentação especifica que "faz leitura e decodificação de Bitmap no thread da interface do usuário, o que pode causar um soluço de latência ... considere usar setImageDrawable () ou setImageBitmap ()". como afirma chetto

resmall
fonte
7

Todas as respostas postadas não se aplicam hoje. Por exemplo, getDrawable () está obsoleto. Aqui está uma resposta atualizada, felicidades!

ContextCompat.getDrawable(mContext, drawable)

Do método documentado

public static final android.graphics.drawable.Drawable getDrawable (@NotNull contexto android.content.Context,
@ android.support.annotation.DrawableRes int id

portfoliobuilder
fonte
Obrigado por mencionar a parte obsoleta.
Karan Sharma
6

Você pode tentar usar este código:

ImageView ImgView = (ImageView)findViewById(R.id.ImgView);
ImgView.setImageResource(R.drawable.myicon);
Mersad Nilchy
fonte
4

Se você não pode obter o objeto Resources como este em uma classe que não é uma Activity, é necessário adicionar o método getContext () para getResources (), por exemplo

ImageView image = (ImageView) v.findViewById(R.id.item_image);
int id = getContext().getResources().getIdentifier(imageName, "drawable", getContext().getPackageName());
image.setImageResource(id);
Vladimir Salguero
fonte
3

imageView.setImageDrawable(getResources().getDrawable(R.drawable.my_drawable));

lxknvlk
fonte
2

Você também pode usar algo como:

imageView.setImageDrawable(ActivityCompat.getDrawable(getContext(), R.drawable.generatedID));

ou usando o Picasso:

Picasso.with(getContext()).load(R.drawable.generatedId).into(imageView);

ninjahoahong
fonte
0

Eu tive o mesmo problema que você e fizemos o seguinte para resolvê-lo:

**IMAGEVIEW**.setImageResource(getActivity()
             .getResources()
             .getIdentifier("**IMG**", "drawable", getActivity()
             .getPackageName()));
JCDecary
fonte
0

Construa uma classe POJO.java e crie "métodos construtor, getter e setter"

class POJO{
        public POJO(Drawable proImagePath) {
                setProductImagePath(proImagePath);
        }

        public Drawable getProductImagePath() {
                return productImagePath;
        }

        public void setProductImagePath(Drawable productImagePath) {
                this.productImagePath = productImagePath;
        }
}

Em seguida, configure os adaptadores por meio de recursos extraíveis de imagem para CustomAdapter.java

    class CustomAdapter extends ArrayAdapter<POJO>{

       private ArrayList<POJO> cartList = new ArrayList<POJO>();
       public MyCartAdapter(Context context, int resource) {
          super(context, resource);
       }

       public MyCartAdapter(Context context, ArrayList<POJO> cartList) {
          super(context, 0, cartList);
          this.context = context;
          this.cartList = cartList;

       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          /*
          *Here you can setup your layout and references.
          **/
          ImageView productImage = (ImageView) rootView.findViewById(R.id.cart_pro_image);
          productImage.setImageDrawable(POJO.getProductImagePath());
        }
    }

Em seguida, passe as referências pelo ActivityClass.java

public class MyCartActivity extends AppCompatActivity{
       POJO pojo;
       CustomAdapter customAdapter;
       ArrayList<POJO> cartList = new ArrayList<POJO>();

       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.your_layout);

          customAdapter = new CustomAdapter(this, cartList);

          pojo = new POJO(getResources().getDrawable(R.drawable.help_green));

    }
}
Abdul Gaffar
fonte
-3

um pedaço do meu projeto, tudo funciona! )

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final ModelSystemTraining modelSystemTraining = items.get(position);

int icon = context.getResources().getIdentifier(String.valueOf(modelSystemTraining.getItemIcon()), "drawable", context.getPackageName());

        final FragmentViewHolderSystem fragmentViewHolderSystem = (FragmentViewHolderSystem) holder;
        final View itemView = fragmentViewHolderSystem.itemView;
//                Set Icon
fragmentViewHolderSystem.trainingIconImage.setImageResource(icon);
//                Set Title
fragmentViewHolderSystem.title.setText(modelSystemTraining.getItemTitle());
//                Set Desc
fragmentViewHolderSystem.description.setText(modelSystemTraining.getItemDescription());
Максим Багрянцев
fonte
Você realmente deve adicionar algumas explicações sobre por que esse código deve funcionar - você também pode adicionar comentários no próprio código - em sua forma atual, ele não fornece nenhuma explicação que possa ajudar o resto da comunidade a entender o que você fez para resolver /Responda à pergunta.
IshmaelKakitla
-3

btnImg.SetImageDrawable (GetDrawable (Resource.Drawable.button_round_green));

API 23 Android 6.0

isaac
fonte
-4

O arquivo 'R' não pode ser gerado no tempo de execução do aplicativo. Você pode usar outras alternativas, como usar if-elseouswitch-case

Vinod Maurya
fonte
Isso não parece estar relacionado à questão. Parece que ele está tentando definir um ImageView a um recurso já existente, ao invés de tentar gerar Rnovamente
Greyson