355 Stimmen

Wie man den Hintergrund in Android programmatisch zeichnet

So stellen Sie den Hintergrund ein:

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

Ist das der beste Weg?

598voto

Lazy Ninja Punkte 21977

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 eine gute Anleitung, wie man große Bitmaps lädt.

UPDATE:
getDrawable(int ) veraltet in API Stufe 22

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

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

Wenn Sie sich den Quellcode von ContextCompat.getDrawable erhalten Sie in etwa 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);
    }
}

Mehr Details auf ContextCompat

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

UPDATE:
Wenn Sie die Bibliothek support v4 verwenden, ist das Folgende für alle Versionen ausreichend.

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

Sie müssen in Ihrer Anwendung build.gradle Folgendes hinzufügen

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

Oder unter Verwendung von ResourceCompat, in jeder API wie unten:

import android.support.v4.content.res.ResourcesCompat;
ResourcesCompat.getDrawable(getResources(), R.drawable.name_of_drawable, null);

120voto

Ahmad Punkte 64242

Versuchen Sie dies:

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

und für API 16<:

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

20voto

Sujay Kumar Punkte 489
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

12voto

Vostro Punkte 179

Ich verwende eine minSdkVersion 16 und targetSdkVersion 23.
Das folgende Beispiel funktioniert bei mir, es verwendet

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

Anstatt zu verwenden:

layout.setBackgroundResource(R.drawable.ready);

Verwenden Sie stattdessen:

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

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

11voto

Firzen Punkte 1779

Wenn Sie AndroidX verwenden, sollten Sie dies tun:

AppCompatResources.getDrawable(context, R.drawable.your_drawable)

Die zuvor aufgeführten Methoden sind veraltet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X