Come impostare programmabile sfondo programmabile in Android


289

Per impostare lo sfondo:

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

È il modo migliore per farlo?


2
Grazie! la tua domanda e tutte le risposte utili mi hanno aiutato a impostare la risorsa di sfondo di un pulsante immagine all'interno di un widget . ecco un codice di esempio nel caso qualcuno fosse interessato:remoteViews.setInt(R.id.btn_start,"setBackgroundResource", R.drawable.ic_button_start);
Sam

1
Kotlin Soluzione per i quali potrebbe essere necessario: stackoverflow.com/a/54495750/6247186
Hamed Jaliliani

Risposte:


490

layout.setBackgroundResource(R.drawable.ready);è corretto.
Un altro modo per ottenerlo è utilizzare quanto segue:

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

Ma penso che il problema si verifichi perché stai cercando di caricare immagini di grandi dimensioni.
Ecco un buon tutorial su come caricare bitmap di grandi dimensioni.

AGGIORNAMENTO:
getDrawable (int) deprecato nel livello API 22


getDrawable(int ) è ora deprecato nel livello API 22. È invece necessario utilizzare il seguente codice dalla libreria di supporto:

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

Se ti riferisci al codice sorgente di ContextCompat.getDrawable , ti dà qualcosa del genere:

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

Maggiori dettagli su ContextCompat

A partire dall'API 22, è necessario utilizzare il getDrawable(int, Theme)metodo anziché getDrawable (int).

AGGIORNAMENTO:
se si utilizza la libreria support v4, quanto segue sarà sufficiente per tutte le versioni.

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

Dovrai aggiungere quanto segue nella tua app build.gradle

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

O usando ResourceCompat, in qualsiasi API come di seguito:

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

3
'getDrawable (int)' è deprecato.
S.M_Emamian il

Ehi, sto provando a fare un compito solo se l'immagine di sfondo di un pulsante immagine è una certa risorsa disegnabile. Come posso confrontare ... Ho provato if(buttonBackground.equals(R.drawable.myDrawable))dove Drawable buttonBackground = myButton.getBackground();ottengo questo errore: snag.gy/weYgA.jpg
Ruchir Baronia

Avresti anche bisogno myActivity.getTheme()dell'ultima versione del metodo, invece del parametro null:myView.setBackground( getResources().getDrawable(R.drawable.my_background, activity.getTheme()));
Zon

oppure puoi AppCompatResources.getDrawable(this.getContext(), resId)invece utilizzarlo , Google lo ha già implementato in AppCompat*widget / vista, ad esempio:android.support.v7.widget.AppCompatCheckBox
mochadwi

108

Prova questo:

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

e per API 16 <:

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

2
ma questa è la stessa cosa Ahmad :)
Mohammad Ersan,

4
ah ok, allora vorrei fare riferimento alla risposta di Lazy Ninjas.
Ahmad,

39
Non hai bisogno getResources().getDrawable(). Il codice corretto è layout.setBackgroundResource(R.drawable.ready);proprio come l'OP utilizzato. Il problema qui deriva dalle dimensioni della bitmap.
BVB,

1
setBackground è solo a livello API 16 o superiore.
Erwan,

17
RelativeLayout relativeLayout;  //declare this globally

ora, all'interno di qualsiasi funzione come onCreate, onResume

relativeLayout = new RelativeLayout(this);  
relativeLayout.setBackgroundResource(R.drawable.view); //or whatever your image is
setContentView(relativeLayout); //you might be forgetting this

9

Puoi anche impostare lo sfondo di qualsiasi immagine:

View v;
Drawable image=(Drawable)getResources().getDrawable(R.drawable.img);
(ImageView)v.setBackground(image);

questo risolve il mio problema, ma devo implementare (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)il codice interno
Armando Marques Sobrinho,

1
Questo è deprecato ora
user7856586

4

Sto usando minSdkVersion 16 e targetSdkVersion 23.
Di seguito funziona per me, utilizza

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

Invece di usare:

layout.setBackgroundResource(R.drawable.ready);

Piuttosto usa:

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

getActivity()viene utilizzato in un frammento, se si utilizza la chiamata da un'attività this.


2

Se i tuoi sfondi sono nella cartella dei disegni in questo momento, prova a spostare le immagini dalla cartella dei disegni a quella dei disegni-nodpi nel tuo progetto. Questo ha funzionato per me, sembra che altrimenti le immagini siano riscalate da loro stessi ..


5
Bene, se non hai una copia delle immagini che devi usare nel progetto in qualità HD, perché lasciare che Android le rivaluti a qualità scadente usando la normale cartella estraibile. E anche fare la domanda è vecchia, se appare ancora su Google che pubblicare qualcosa di nuovo in esso è ok imho.
Jordy,

1

Usa butterknife per associare la risorsa disegnabile a una variabile aggiungendola all'inizio della tua classe (prima di qualsiasi metodo).

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

quindi all'interno di uno dei tuoi metodi aggiungi

layout.setBackground(background);

Questo è tutto ciò di cui hai bisogno


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

Prova questo codice:

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

0

prova questo.

 int res = getResources().getIdentifier("you_image", "drawable", "com.my.package");
 preview = (ImageView) findViewById(R.id.preview);
 preview.setBackgroundResource(res);


-1

All'interno dell'app / res / your_xml_layout_file .xml

  1. Assegna un nome al layout principale.
  2. Vai su MainActivity e trova RelativeLayout chiamando findViewById (R.id. "Given_name").
  3. Usa il layout come un oggetto classico, chiamando il metodo setBackgroundColor ().
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.