Як програмно встановити фоновий малюнок у програмі 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
Котлін рішення , для яких може знадобитися: stackoverflow.com/a/54495750/6247186
Хамед Jaliliani

Відповіді:


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

Але я думаю, що проблеми виникають тому, що ви намагаєтеся завантажити великі зображення.
Ось хороший підручник, як завантажувати великі растрові карти.

ОНОВЛЕННЯ:
застарене (int) getDrawable (int) на рівні 22


getDrawable(int ) тепер застаріло на рівні 22 API. Натомість слід використовувати наступний код із бібліотеки підтримки:

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

Якщо ви посилаєтесь на вихідний код ContextCompat.getDravable , він дає вам щось подібне:

/**
 * 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)метод замість getDravable (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()));
Зон,

або ви можете використовувати 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));

2
але це те саме, що Ахмад :)
Мохаммед Ерсан

4
Ага гаразд, тоді я б відповів на відповідь Ледачих Ніндзя.
Ахмад

39
Вам не потрібно getResources().getDrawable(). Правильний код так layout.setBackgroundResource(R.drawable.ready);само, як і використовуваний ОП. Проблема тут пов'язана з розміром растрової карти.
БВБ

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)внутрішній код
Армандо Маркес Собриньо

1
Зараз це застаріло
користувач7856586

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

Якщо ваші фони зараз у папці, що витягується, спробуйте перемістити зображення з папки, що перетворюється, у папку dravable-nodpi у вашому проекті. Це працювало для мене, здається, що ще зображення переробляються ними самостійно.


5
Добре, якщо у вас немає копії зображень, які вам потрібно використати в проекті, у якості HD, чому дозвольте андроїд змінити їх масштаб до шаленої якості, використовуючи звичайну папку, що виводиться. І навіть питання старе, якщо воно все-таки з’являється в Google, ніж публікувати щось нове в ньому, це нормально.
Джорді

1

Використовуйте жировий ніж, щоб прив’язати ресурс, що виводиться, до змінної, додавши це у верхній частині вашого класу (перед будь-якими методами).

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


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


-1

Всередині програми / res / your_xml_layout_file .xml

  1. Призначте ім’я для батьківського макета.
  2. Перейдіть до вашої MainActivity і знайдіть свій відносний макет, зателефонувавши на findViewById (R.id. "Задане ім'я").
  3. Використовуйте макет як класичний об'єкт, викликаючи метод setBackgroundColor ().
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.