Wie man den Hintergrund programmgesteuert in Android zeichnen kann

289

So stellen Sie den Hintergrund ein:

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

Ist der beste Weg, es zu tun?

Chad Bingham
quelle
2
Danke dir! Ihre Frage und alle hilfreichen Antworten haben mir geholfen, die Hintergrundressource einer Bildschaltfläche in einem Widget festzulegen . Hier ist ein Beispielcode für den Fall, dass jemand interessiert ist:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam
1
Kotlin-Lösung für wen möglicherweise benötigt: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Antworten:

490

layout.setBackgroundResource(R.drawable.ready);ist richtig.
Eine andere Möglichkeit, dies zu erreichen, besteht darin, Folgendes zu verwenden:

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

Aber ich denke, das Problem tritt auf, weil Sie versuchen, große Bilder zu laden.
Hier ist ein gutes Tutorial zum Laden großer Bitmaps.

UPDATE:
getDrawable (int), das in API-Ebene 22


getDrawable(int ) veraltet ist, ist jetzt in API-Ebene 22 veraltet. Sie sollten stattdessen den folgenden Code aus der Support-Bibliothek verwenden:

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

Wenn Sie auf den Quellcode von ContextCompat.getDrawable verweisen , erhalten Sie Folgendes :

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

Weitere Details zu ContextCompat

Ab API 22 sollten Sie die getDrawable(int, Theme)Methode anstelle von getDrawable (int) verwenden.

UPDATE:
Wenn Sie die Support v4-Bibliothek verwenden, reicht Folgendes für alle Versionen aus.

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

Sie müssen Folgendes in Ihre App build.gradle einfügen

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

Oder verwenden Sie ResourceCompat in einer der folgenden APIs:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);
Fauler Ninja
quelle
3
'getDrawable (int)' ist veraltet.
S.M_Emamian
Hey, ich versuche nur, eine Aufgabe zu erledigen, wenn das Hintergrundbild einer Bildschaltfläche eine bestimmte zeichnbare Ressource ist. Wie kann ich vergleichen ... Ich habe versucht, if(buttonBackground.equals(R.drawable.myDrawable))wo Drawable buttonBackground = myButton.getBackground();ich diesen Fehler bekomme
Ruchir Baronia
Sie würden auch myActivity.getTheme()für die neueste Version der Methode anstelle von null Parameter benötigen :myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon
oder Sie können AppCompatResources.getDrawable(this.getContext(), resId)stattdessen verwenden, Google hat es bereits in AppCompat*Widget / Ansicht implementiert , zB:android.support.v7.widget.AppCompatCheckBox
Mochadwi
108

Versuche dies:

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

und für API 16 <:

layout.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.ready));
Ahmad
quelle
2
aber das ist das gleiche Ahmad :)
Mohammad Ersan
4
ah ok, dann würde ich mich auf Lazy Ninjas Antwort beziehen.
Ahmad
39
Das brauchst du nicht getResources().getDrawable(). Der richtige Code entspricht layout.setBackgroundResource(R.drawable.ready);genau dem verwendeten OP. Das Problem liegt hier in der Größe der Bitmap.
BVB
1
setBackground ist nur API-Level 16 oder höher.
Erwan
17
RelativeLayout relativeLayout;  //declare this globally

Jetzt in jeder Funktion wie 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
quelle
9

Sie können auch den Hintergrund für jedes Bild festlegen:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);
Bhaskar Kumar Singh
quelle
Dies löst mein Problem, aber ich muss den (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)inneren Code implementieren
Armando Marques Sobrinho
1
Dies ist jetzt veraltet
user7856586
4

Ich verwende eine minSdkVersion 16 und eine targetSdkVersion 23.
Das Folgende funktioniert für mich, es wird verwendet

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

Anstatt zu verwenden:

layout.setBackgroundResource(R.drawable.ready);

Verwenden Sie lieber:

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

getActivity()wird in einem Fragment verwendet, wenn der Aufruf von einer Aktivität verwendet wird this.

Vostro
quelle
2

Wenn sich Ihre Hintergründe gerade im Zeichenordner befinden, versuchen Sie, die Bilder in Ihrem Projekt vom Zeichen- in den Zeichen-Nodpi-Ordner zu verschieben. Das hat bei mir funktioniert, anscheinend werden die Bilder sonst von ihnen selbst neu skaliert.

Jordy
quelle
5
Nun, wenn Sie keine Kopie der Bilder haben, die Sie für das Projekt in HD-Qualität verwenden müssen, lassen Sie Android sie mithilfe des normalen Zeichenordners auf beschissene Qualität skalieren. Und selbst wenn die Frage alt ist, ist es in Ordnung, wenn sie immer noch in Google auftaucht, als etwas Neues darin zu posten.
Jordy
1

Verwenden Sie Buttermesser , um die zeichnbare Ressource an eine Variable zu binden, indem Sie diese am Anfang Ihrer Klasse hinzufügen (vor allen Methoden).

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

dann innerhalb einer Ihrer Methoden hinzufügen

layout.setBackground(background);

Das ist alles was du brauchst

Stephen
quelle
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
quelle
1

Probieren Sie es aus ViewCompat.setBackground(yourView, drawableBackground)

Umair Khalid
quelle
0

Versuchen Sie diesen Code:

Drawable thumb = ContextCompat.getDrawable(getActivity(), R.mipmap.cir_32);
mSeekBar.setThumb(thumb);
Ashwin H.
quelle
0

Versuche dies.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);
Franklin CI
quelle
0
setBackground(getContext().getResources().getDrawable(R.drawable.green_rounded_frame));
Mohamed AbdelraZek
quelle
1
Anzeigenerklärung bitte.
vonbrand
-1

In der App / res / your_xml_layout_file .xml

  1. Weisen Sie Ihrem übergeordneten Layout einen Namen zu.
  2. Gehen Sie zu Ihrer MainActivity und suchen Sie Ihr RelativeLayout, indem Sie findViewById (R.id. "Given_name") aufrufen.
  3. Verwenden Sie das Layout als klassisches Objekt, indem Sie die Methode setBackgroundColor () aufrufen.
Vaggos Phl
quelle