Я генерирую строку из базы данных динамически, которая имеет то же имя изображения в папке drawable
.
Теперь я хочу установить это значение для ImageView
с помощью setImageDrawable(R.id.StringGenerated)
динамически.
Любые предложения..
Я генерирую строку из базы данных динамически, которая имеет то же имя изображения в папке drawable
.
Теперь я хочу установить это значение для ImageView
с помощью setImageDrawable(R.id.StringGenerated)
динамически.
Любые предложения..
Попробуйте это,
int id = getResources().getIdentifier("yourpackagename:drawable/" + StringGenerated, null, null);
Это вернет идентификатор выталкиваемого объекта, к которому вы хотите получить доступ... то вы можете установить изображение в режиме просмотра изображений, выполнив следующие
imageview.setImageResource(id);
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));
Я лично предпочитаю использовать метод setImageResource()
следующим образом.
ImageView myImageView = (ImageView)findViewById(R.id.myImage);
myImageView.setImageResource(R.drawable.icon);
Имена ресурса, которые можно использовать, не сохраняются в виде строк, поэтому вам придется разрешить строку в целочисленную константу, сгенерированную во время сборки. Вы можете использовать класс Resources
для преобразования строки в это целое число.
Resources res = getResources();
int resourceId = res.getIdentifier(
generatedString, "drawable", getPackageName() );
imageView.setImageResource( resourceId );
Это разрешает вашу сгенерированную строку в целое число, которое ImageView
может использовать для загрузки правильного изображения.
В качестве альтернативы вы можете использовать идентификатор для загрузки Drawable
вручную, а затем установить образ, используя этот метод, вместо идентификатора ресурса.
Drawable drawable = res.getDrawable( resourceId );
imageView.setImageDrawable( drawable );
Проще, как этот ответ:
Drawable myDrawable = getResources().getDrawable(R.drawable.pic);
imageview.setImageDrawable(myDrawable);
Это работает, по крайней мере, в 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(), но в документации указывается, что "делает растровое чтение и декодирование в потоке пользовательского интерфейса, что может вызвать задержку икры... рассмотрим использование setImageDrawable() или setImageBitmap()". как указано chetto
Если вы не можете получить ресурс таким ресурсом, как этот, в классе, который не является активностью, вам нужно добавить метод getContext() для getResources(), например
ImageView image = (ImageView) v.findViewById(R.id.item_image);
int id = getContext().getResources().getIdentifier(imageName, "drawable", getContext().getPackageName());
image.setImageResource(id);
Вы также можете использовать что-то вроде:
imageView.setImageDrawable(ActivityCompat.getDrawable(getContext(),
R.drawable.generatedID));
или используя Picasso:
Picasso.with(getContext()).load(R.drawable.generatedId).into(imageView);
Все опубликованные ответы не применяются сегодня. Например, функция getDrawable() устарела. Вот обновленный ответ, приветствия!
ContextCompat.getDrawable(mContext, drawable)
Из документального метода
public static final android.graphics.drawable.Drawable getDrawable (@NotNull android.content.Context context,
@android.support.annotation.DrawableRes int id
У меня была такая же проблема, как и вы, и я решил сделать следующее:
**IMAGEVIEW**.setImageResource(getActivity()
.getResources()
.getIdentifier("**IMG**", "drawable", getActivity()
.getPackageName()));
Создайте класс POJO.java и создайте "методы конструктора, метода getter и setter"
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));
}
}
часть моего проекта, все работает! )
@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());
Файл "R" не может быть создан во время выполнения приложения. Вы можете использовать некоторые другие альтернативы, такие как использование if-else
или switch-case