setImageDrawableを動的に使用してImageViewに画像を設定する


120

drawableフォルダー内の画像と同じ名前の文字列をデータベースから動的に生成しています。

次に、動的にImageView使用するためにその値を設定しますsetImageDrawable(R.id.StringGenerated)

助言がありますか..


画像のIDを動的に生成しているということですか?
Paresh Mayani

回答:


195

これを試して、

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

これは、アクセスしたいドローアブルのIDを返します...次のようにして、imageviewに画像を設定できます。

imageview.setImageResource(id);

おかげで..私はそれがどこか他の場所でそれを見つけたbtあなたの努力にまだ感謝.. :)
Arun

12
ただし、setImageResource()を使用すると、「UIスレッドでビットマップの読み取りとデコードが行われるため、待ち時間の問題が発生する可能性があります... setImageDrawable()またはsetImageBitmap()の使用を検討してください。」(Androidドキュメント)
シェット

6
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);

または

setImageDrawable(getResources().getDrawable(R.drawable.icon));

彼はデータベースから同じ名前の画像を動的に生成していると彼は言った。
Paresh Mayani

3
getDrawable(R.drawable.icon)は非推奨
Daryn

getDrawable(R.drawable.icon)を解決する必要がある人は非推奨です。このSOリンク
Codingpan

77

私は個人的にはsetImageResource()このような方法を使うことを好みます。

ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);

1
getResources()メソッドを呼び出すコンテキストがないコード内の任意の場所から画像を変更したい場合があるため、これが優先されます。例:アダプター。この機能だけのために、コンストラクタを介してコンテキストを渡す必要はありません。
Phatee P 2016

1
ウェイクリーナー。これが好ましい答えではない理由がわかりません。
Benjamin Basmaci、

@BenjaminBasmaciこれは、UIスレッドでビットマップの読み取りとデコードを行うため、レイテンシの問題が発生する可能性があります。これが問題になる場合は、代わりにsetImageDrawable(android.graphics.drawable.Drawable)またはsetImageBitmap(android.graphics.Bitmap)とBitmapFactoryの使用を検討してください。(Androidドキュメントから)
Tayyab Mazhar

25

リソースのドローアブル名は文字列として保存されないため、ビルド中に生成された整数定数に文字列を解決する必要があります。Resourcesクラスを使用して、文字列をその整数に解決できます。

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

これにより、生成された文字列が、ImageViewが正しい画像をロードするために使用できる整数に解決されます。

または、IDを使用してDrawable手動で読み込み、リソースIDの代わりにそのドローアブルを使用して画像を設定することもできます。

Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );

@グレイソン...私が探している素敵なサー..サッツ..ありがとうございました.. :)
アルン


8

これは少なくともAndroid API 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);

setImageResource()を使用することもできますが、ドキュメントでは 「UIスレッドでビットマップの読み取りとデコードを行うため、待ち時間の問題が発生する可能性があります... setImageDrawable()またはsetImageBitmap()の使用を検討してください。」シェットが述べたように


7

投稿されたすべての回答が今日適用されるわけではありません。たとえば、getDrawable()は非推奨です。これが更新された答えです、乾杯!

ContextCompat.getDrawable(mContext, drawable)

文書化された方法から

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


非推奨の部分について言及していただきありがとうございます。
Karan Sharma


4

アクティビティではないクラスでこのようなResourcesオブジェクトを取得できない場合は、たとえばgetResources()のgetContext()メソッドを追加する必要があります。

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

3

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


2

次のようなものも使用できます。

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

またはピカソを使用:

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


0

私はあなたと同じ問題を抱えていて、それを解決するために次のことをしました:

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

0

POJO.javaクラスを作成し、「コンストラクタ、ゲッター、セッターメソッド」を作成する

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

        public Drawable getProductImagePath() {
                return productImagePath;
        }

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

次に、イメージのドローアブルリソースを介して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());
        }
    }

次に、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));

    }
}

-3

私のプロジェクトの一部で、すべてがうまくいきます!)

@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());

このコードが機能する理由について説明を追加する必要があります。コード自体にコメントを追加することもできます。現在の形式では、コミュニティの他のメンバーが解決策を理解するのに役立つ説明は提供されていません。 /質問に答えて。
ishmaelMakitla 2016年

-3

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

API 23 Android 6.0


-4

アプリの実行時に「R」ファイルを生成できません。if-elseまたはを使用するなど、他の代替手段を使用できます。switch-case


これは問題とは関係がないようです。Rもう一度生成しようとするのではなく、既存のリソースにイメージビューを設定しようとしているようです
Greyson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.