setBackground vs setBackgroundDrawable (Android)


258

Я хочу встановити фон, який можна переглядати. Для цього є два методи (наскільки я бачу): setBackgroundі setBackgroundDrawable.

Коли я використовую setBackground, він каже, що він доданий у рівні API 16, але мінімальна версія SDK мого проекту - це 7. Я припускаю, що він не буде працювати над чим-небудь нижче 16, чи не так? Але коли я використовую setBackgroundDravable, він говорить про застаріле.

Що я повинен використовувати?


Використовуйте: image.setImageResource (R.dravable.icon_dot1);
Хоробрий

Відповіді:


403

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

int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    setBackgroundDrawable();
} else {
    setBackground();
}

Для цього вам потрібно встановити buildTarget api 16 та min build на 7 або щось подібне.


4
Він все ще скаржиться на те, що setBackgroundDravable застарілий. Чи потрібно насправді придушувати попередження лише тому, що Google хотів змінити ім'я методу?
Чарлі-Блейк

2
@ santirivera92 Так, ви також можете створити 2 проекти: 1 націлювання, перш ніж це було проблемою, і 1 після. Це звучить як простий варіант? (Насправді іноді так і є, так багато виправлень у ICS)
Warpzit

4
Я встановлюю android:minSdkVersion="7" android:targetSdkVersion="17", однак setBackground () з'являється як помилка: для виклику потрібен рівень 16 API (поточний хв. 7)
Jonny

20
Це заважало мені складати. Я поставив проблемний код у свою функцію і вимкнено лише для такої функції, як ця. @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") private static void setBg(RelativeLayout layout, BitmapDrawable TileMe) { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { layout.setBackgroundDrawable(TileMe); } else { layout.setBackground(TileMe); } }
Джоні

2
@Snicolas Так, IDE або Android повинні мати можливість робити таку логіку для нас.
Warpzit

111

Ви можете використовувати setBackgroundResource()натомість, який знаходиться в рівні API 1.


78
... але тільки якщо ви отримали ідентифікатор ресурсу, а не створений вами клас малювання!
Зордід

не існує способу отримання ідентифікатора, який можна отримати, на який ви маєте посилання?
Путратор

2
setBackgroundResource () не є альтернативою setBackgroundDravable (); або setBackground () ;. Не пов’язано взагалі, перший додає ресурс, що малюється, а другий додає митну програму.
MBH

Що робити, якщо мені доведеться встановлювати фон неодноразово, скажімо в listview? setBackgroundResource(int)приймає ідентифікатор ресурсу, тому він повинен кожного разу надувати подання, щоб встановити фон. Я не хочу такої поведінки, якщо припустити, що я вже завищив Dravable. Я щось пропускаю?
азізбекіян

Що робити, якщо у мене є тільки малюнок !?
MBH

55

Здається, що в даний час немає різниці між двома функціями, як показано у вихідному коді (кредит на цю посаду ):

public void setBackground(Drawable background) {
    //noinspection deprecation
    setBackgroundDrawable(background);
}

@Deprecated
public void setBackgroundDrawable(Drawable background) { ... }

тож це просто рішення про називання, подібне до рішення, яке має "fill-parent vs match-parent".


5
чудово! Дякую. Нерозумно, що генерується попередження про щось таке кульгаве, як перейменування функції.
Хтось десь

1
@ M.kazemAkhgary Це не перший раз, коли вони зневажають щось лише для зміни імені. У них було змінено "fill_parent" на "match_parent" для значень парам макета. Обидва - це абсолютно те саме, що вказує на однакове значення ..
андроїд розробник

18

Я знаю, що це старе питання, але у мене схожа ситуація, і моє рішення було

button.setBackgroundResource( R.drawable.ic_button );
Drawable d = button.getBackground();

а потім ви можете грати з "Dravable", застосовуючи кольорові фільтри тощо


6
Це працює лише в тому випадку, якщо оригінальне зображення надходить з ресурсу.
Метт Хаггінс

Це навіть не відповідає на питання ОП.
Петро


12

ви можете використовувати setBackgroundResource()замість цього, тобтоrelativeLayout.setBackgroundResource(R.drawable.back);

це працює для мене.


7

Тепер ви можете використовувати будь-який із цих варіантів. І це буде працювати в будь-якому випадку. Ваш колір може бути кодом HEX , наприклад, таким:

myView.setBackgroundResource(ContextCompat.getColor(context, Color.parseColor("#FFFFFF")));

Колір ресурс , як це:

myView.setBackgroundResource(ContextCompat.getColor(context,R.color.blue_background));

Або користувацький ресурс xml , наприклад:

myView.setBackgroundResource(R.drawable.my_custom_background);

Сподіваюся, це допомагає!


6

Використовуючи Android Studio 1.5.1, я отримав такі попередження:

Call requires API level 16 (current min is 9): android.view.View#setBackground

скарги на депресію

'setBackgroundDrawable(android.graphics.drawable.Drawable)' is deprecated

Використовуючи цей формат, я позбувся обох:

    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        //noinspection deprecation
        layout.setBackgroundDrawable(drawable);
    } else {
        layout.setBackground(drawable);
    }

1

Це працює для мене: перегляд перегляду - це ваш editText, спінер ... тощо. І int Drawable - це ваш приклад маршруту для малювання (R.dravable.yourDravable)

 public void verifyDrawable (View view, int drawable){

        int sdk = Build.VERSION.SDK_INT;

        if(sdk < Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackgroundDrawable(
                    ContextCompat.getDrawable(getContext(),drawable));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(getResources().getDrawable(drawable));
        }    
    }


-2

У мене також була ця проблема, але я вирішив вирішити за допомогою ImageView .

Спробуйте скористатися відносною схемою та додайте всередину нього ImageView (ширина та висота: fill_parent, scaleType: center).

Також переконайтесь, що перегляд зображення є першим елементом всередині RelativeLayout, тому він буде виконувати роль фонового зображення.


1
Насправді це повинно бути не більше ніж ifзастереження. Дивіться правильну відповідь.
Pijusn

-4

Ви також можете зробити це:

try {
     myView.getClass().getMethod(android.os.Build.VERSION.SDK_INT >= 16 ? "setBackground" : "setBackgroundDrawable", Drawable.class).invoke(myView, myBackgroundDrawable);
} catch (Exception ex) {
     // do nothing
}

РЕДАКТУВАННЯ: Як зазначає @BlazejCzapp , бажано уникати використання рефлексії, якщо вам вдасться вирішити проблему без неї. У мене був випадок використання, коли я не зміг вирішити без роздумів, але це вище не так. Для отримання додаткової інформації перегляньте сторінку http://docs.oracle.com/javase/tutorial/reflect/index.html


4
@BlazejCzapp LOL, але це НЕ відповідає на питання, тому його не слід зволікати без пояснень. Коли ви скажете дитині нічого не робити, не сказавши, чому вони це робитимуть;)
Fabricio

11
Я не хочу переходити з теми, але ось деякі причини: 1. Java є статично набраною мовою - використовуйте компілятор; 2. Це просто висловлювання, якщо маскується (це заперечує справжню логіку); 3. Це виведення гармати для вбивства комара - цей код використовує серйозну артилерію для вирішення тривіальної проблеми; Сподіваюсь, що це дещо виправдає
Błażej Czapp

Дякую @BlazejCzapp, ти маєш рацію, тут у мене був випадок використання, коли потрібно було робити такі речі, як код вище, але його не слід використовувати, якщо є правильний спосіб впоратися з цим.
Fabricio

2
Це німий ... немає абсолютно ніяких причин використовувати роздуми для досягнення цього.
Алекс Локвуд

Так, скажіть тому, хто задав просте запитання "Що я повинен використовувати?" почати змінювати час виконання.
Петро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.