Jak ustawić programowalne tło w Androidzie

289

Aby ustawić tło:

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

Czy to najlepszy sposób, aby to zrobić?

Chad Bingham
źródło
2
Dziękuję Ci! twoje pytanie i wszystkie pomocne odpowiedzi pomogły mi ustawić zasób tła przycisku graficznego wewnątrz widżetu . oto przykładowy kod na wypadek, gdyby ktoś był zainteresowany:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam
1
Rozwiązanie Kotlin, dla którego może potrzebować: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Odpowiedzi:

490

layout.setBackgroundResource(R.drawable.ready);jest poprawne.
Innym sposobem na osiągnięcie tego jest użycie:

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

Ale myślę, że problem występuje, ponieważ próbujesz załadować duże obrazy.
Oto dobry samouczek, jak ładować duże mapy bitowe.

AKTUALIZACJA:
getDrawable (int) przestarzałe na poziomie API 22


getDrawable(int ) jest teraz przestarzałe na poziomie API 22. Zamiast tego należy użyć następującego kodu z biblioteki wsparcia:

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

Jeśli odwołujesz się do kodu źródłowego ContextCompat.getDrawable , daje ci to coś takiego:

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

Więcej informacji na temat ContextCompat

Począwszy od API 22, powinieneś użyć getDrawable(int, Theme)metody zamiast getDrawable (int).

AKTUALIZACJA:
Jeśli korzystasz z biblioteki obsługi v4, dla wszystkich wersji wystarczą następujące informacje.

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

Musisz dodać następujące elementy w aplikacji build.gradle

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

Lub za pomocą ResourceCompat w dowolnym interfejsie API, takim jak poniżej:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Leniwy Ninja
źródło
3
„getDrawable (int)” jest przestarzałe.
S.M_Emamian
Hej, próbuję wykonać zadanie tylko wtedy, gdy obraz tła przycisku obrazu jest pewnym zasobem do rysowania. Jak mogę porównać ... Próbowałem if(buttonBackground.equals(R.drawable.myDrawable))skąd Drawable buttonBackground = myButton.getBackground();wziąć ten błąd: snag.gy/weYgA.jpg
Ruchir Baronia
Będziesz także potrzebować myActivity.getTheme()najnowszej wersji metody, zamiast parametru null:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon
lub możesz użyć AppCompatResources.getDrawable(this.getContext(), resId)zamiast tego, Google już zaimplementował to w AppCompat*widżecie / widoku, np .:android.support.v7.widget.AppCompatCheckBox
mochadwi
108

Spróbuj tego:

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

i dla API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad
źródło
2
ale to jest to samo Ahmad :)
Mohammad Ersan
4
ah ok, wtedy odniosę się do odpowiedzi Lazy Ninja.
Ahmad,
39
Nie trzeba getResources().getDrawable(). Prawidłowy kod jest layout.setBackgroundResource(R.drawable.ready);taki sam, jak użyty OP. Problem pochodzi z rozmiaru mapy bitowej.
BVB,
1
setBackground ma tylko interfejs API w wersji 16 lub wyższej.
Erwan
17
RelativeLayout relativeLayout;  //declare this globally

teraz wewnątrz dowolnej funkcji, takiej jak onCreate, onResume

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this
Sujay Kumar
źródło
9

Możesz także ustawić tło dowolnego obrazu:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
Bhaskar Kumar Singh
źródło
to rozwiązuje mój problem, ale muszę wdrożyć (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)wewnętrzny kod
Armando Marques Sobrinho
1
To jest już przestarzałe
użytkownik7856586
4

Korzystam z minSdkVersion 16 i targetSdkVersion 23.
Poniższe działa dla mnie, używa

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

Zamiast używać:

layout.setBackgroundResource(R.drawable.ready);

Raczej użyj:

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

getActivity()jest używany we fragmencie, jeśli wywołuje się z użycia działania this.

Vostro
źródło
2

Jeśli twoje tła znajdują się teraz w folderze do rysowania, spróbuj przenieść obrazy z folderu Drawable do folderu Drawable-Nodpi w swoim projekcie. To działało dla mnie, wydaje się, że w innym przypadku obrazy są przeskalowywane przez nich samych ..

Jordy
źródło
5
Cóż, jeśli nie masz kopii obrazów, których musisz użyć w projekcie w jakości HD, dlaczego Android pozwala przeskalować je do kiepskiej jakości, używając normalnego folderu z możliwością rysowania. I nawet pytanie jest stare, jeśli nadal pojawia się w Google, niż publikowanie czegoś nowego jest w porządku, imho.
Jordy,
1

Użyj Butterknife, aby powiązać zasób do rysowania ze zmienną, dodając go na szczyt klasy (przed dowolnymi metodami).

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

następnie dodaj jedną z metod

layout.setBackground(background);

To wszystko czego potrzebujesz

Stephen
źródło
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));
Sameer Chamankar
źródło
1

Spróbuj ViewCompat.setBackground(yourView, drawableBackground)

Umair Khalid
źródło
0

Wypróbuj ten kod:

Drawable thumb = ContextCompat.getDrawable(getActivity(), R.mipmap.cir_32);
mSeekBar.setThumb(thumb);
Ashwin H.
źródło
0

Spróbuj tego.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
Franklin CI
źródło
0
setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));
Mohamed AbdelraZek
źródło
1
Proszę o wyjaśnienie reklamy.
vonbrand
-1

Wewnątrz aplikacji / res / your_xml_layout_file .xml

  1. Przypisz nazwę do układu nadrzędnego.
  2. Idź do MainActivity i znajdź swój RelativeLayout, wywołując findViewById (R.id. „Podano_nazwa”).
  3. Użyj układu jako klasycznego obiektu, wywołując metodę setBackgroundColor ().
Vaggos Phl
źródło