Как установить фон рисования программно в Android

289

Чтобы установить фон:

RelativeLayout layout =(RelativeLayout)findViewById(R.id.background);
layout.setBackgroundResource(R.drawable.ready);

Это лучший способ сделать это?

Чад Бингхэм
источник
2
Спасибо! Ваш вопрос и все полезные ответы помогли мне установить фоновый ресурс кнопки изображения внутри виджета . Вот пример кода на случай, если кому-то будет интересно:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Сэм
1
Решение Kotlin, для которого может понадобиться: stackoverflow.com/a/54495750/6247186
Хамед Джалилиани,

Ответы:

490

layout.setBackgroundResource(R.drawable.ready);правильно.
Другой способ добиться этого - использовать следующее:

final int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready) );
} else {
    layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));
}

Но я думаю, что проблема возникает, потому что вы пытаетесь загрузить большие изображения.
Вот хороший учебник, как загружать большие растровые изображения.

ОБНОВЛЕНИЕ:
getDrawable (int) устарело на уровне API 22


getDrawable(int ) , теперь устарело на уровне API 22. Вместо этого следует использовать следующий код из библиотеки поддержки:

ContextCompat.getDrawable(context, R.drawable.ready)

Если вы ссылаетесь на исходный код ContextCompat.getDrawable , он дает вам что-то вроде этого:

/**
 * Return a drawable object associated with a particular resource ID.
 * <p>
 * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned
 * drawable will be styled for the specified Context's theme.
 *
 * @param id The desired resource identifier, as generated by the aapt tool.
 *            This integer encodes the package, type, and resource entry.
 *            The value 0 is an invalid identifier.
 * @return Drawable An object that can be used to draw this resource.
 */
public static final Drawable getDrawable(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 21) {
        return ContextCompatApi21.getDrawable(context, id);
    } else {
        return context.getResources().getDrawable(id);
    }
}

Подробнее о ContextCompat

Начиная с API 22, вы должны использовать getDrawable(int, Theme)метод вместо getDrawable (int).

ОБНОВЛЕНИЕ:
Если вы используете библиотеку поддержки v4, следующего будет достаточно для всех версий.

ContextCompat.getDrawable(context, R.drawable.ready)

Вам нужно будет добавить следующее в ваше приложение build.gradle

compile 'com.android.support:support-v4:23.0.0' # or any version above

Или используя ResourceCompat в любом API, как показано ниже:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Ленивый ниндзя
источник
3
getDrawable (int) устарела.
S.M_Emamian
Эй, я пытаюсь выполнить задачу только в том случае, если фоновое изображение кнопки с изображением представляет собой определенный ресурс для рисования. Как я могу сравнить ... Я пробовал, if(buttonBackground.equals(R.drawable.myDrawable))где Drawable buttonBackground = myButton.getBackground();я получаю эту ошибку: snag.gy/weYgA.jpg
Ruchir Baronia
Вам также потребуется myActivity.getTheme()последняя версия метода вместо нулевого параметра:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon
или вы можете использовать AppCompatResources.getDrawable(this.getContext(), resId)вместо этого, Google уже реализовал это в AppCompat*виджет / представление, например:android.support.v7.widget.AppCompatCheckBox
mochadwi
108

Попробуй это:

layout.setBackground(ContextCompat.getDrawable(context, R.drawable.ready));

и для API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad
источник
2
но это то же самое, Ахмад :)
Мухаммед Эрсан
4
ну ладно, тогда я бы сослался на ответ Ленивых Ниндзя.
Ахмад
39
Вам не нужно getResources().getDrawable(). Правильный код такой layout.setBackgroundResource(R.drawable.ready);же, как и используемый ОП. Проблема здесь связана с размером растрового изображения.
BVB
1
setBackground - API уровня 16 или выше.
Эрван
17
RelativeLayout relativeLayout;  //declare this globally

теперь внутри любой функции, например onCreate, onResume

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this
Суджай Кумар
источник
9

Вы также можете установить фон любого изображения:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
Бхаскар Кумар Сингх
источник
это решит мою проблему, но мне нужно реализовать (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)внутренний код
Armando Marques Sobrinho
1
Это устарело
user7856586
4

Я использую minSdkVersion 16 и targetSdkVersion 23.
У меня работает следующее, он использует

ContextCompat.getDrawable(context, R.drawable.drawable);

Вместо того, чтобы использовать:

layout.setBackgroundResource(R.drawable.ready);

Скорее используйте:

layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));

getActivity()используется во фрагменте, если вызов от использования активности this.

лоро
источник
2

Если ваши фоны находятся сейчас в папке drawable, попробуйте переместить изображения из папки drawable в папку drawable-nodpi в вашем проекте. Это сработало для меня, кажется, что еще изображения изменяются сами по себе ..

Джорди
источник
5
Хорошо, если у вас нет копии изображений, которые вам нужно использовать в проекте, в качестве HD, почему бы позволить Android масштабировать их до дерьмового качества, используя обычную папку для рисования. И даже если вопрос старый, если он все еще всплывает в Google, тогда публикация чего-то нового в нем - хорошо, imho.
Джорди
1

Используйте butterknife, чтобы привязать ресурс drawable к переменной, добавив его в начало вашего класса (перед любыми методами).

@Bind(R.id.some_layout)
RelativeLayout layout;
@BindDrawable(R.drawable.some_drawable)
Drawable background;

затем внутри одного из ваших методов добавить

layout.setBackground(background);

Это все что тебе нужно

Стивен
источник
1
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
     layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.ready));
else if(android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1)
     layout.setBackground(getResources().getDrawable(R.drawable.ready));
else
     layout.setBackground(ContextCompat.getDrawable(this, R.drawable.ready));
Самер Чаманкар
источник
1

Попробуй ViewCompat.setBackground(yourView, drawableBackground)

Умайр Халид
источник
0

Попробуйте этот код:

Drawable thumb = ContextCompat.getDrawable(getActivity(), R.mipmap.cir_32);
mSeekBar.setThumb(thumb);
Эшвин Х
источник
0

попробуй это.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
Франклин С.И.
источник
0
setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));
Мохамед АбдельраЗек
источник
1
Объяснение объявления, пожалуйста.
vonbrand
-1

Внутри приложения / res / your_xml_layout_file .xml

  1. Присвойте имя вашему родительскому макету.
  2. Перейдите в свой MainActivity и найдите свой RelativeLayout, вызвав findViewById (R.id. "Given_name").
  3. Используйте макет как классический объект, вызвав метод setBackgroundColor ().
Ваггос Фл
источник