web-dev-qa-db-fra.com

Button.setBackground (Arrière-plan dessinable) génère NoSuchMethodError

J'implémente une méthode simple pour ajouter une Button à une LinearLayout par programmation.

Lorsque j'appelle la méthode setBackground (Drawable background), la variable Error suivante est générée: 

Java.lang.NoSuchMethodError: Android.widget.Button.setBackground

Ma méthode addNewButton:

private void addNewButton(Integer id, String name) {

        Button b = new Button(this);
        b.setId(id);
        b.setText(name);
        b.setTextColor(color.white);
        b.setBackground(this.getResources().getDrawable(R.drawable.orange_dot));
            //llPageIndicator is the Linear Layout.
        llPageIndicator.addView(b);
}
11

Vous testez peut-être sur une API de niveau inférieur à 16 ( Jelly Bean ). 

La méthode setBackground est uniquement disponible à partir de ce niveau d'API. 

J'essaierais avec setBackgroundDrawable (obsolète) ou setBackgroundResource si c'est le cas. 

Par exemple: 

Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
Button one = new Button(this);
// mediocre
one.setBackgroundDrawable(d);
Button two = new Button(this);
// better
two.setBackgroundResource(R.drawable.ic_launcher);
33
Mena

Pour créer un arrière-plan homogène pour une vue, vous pouvez créer une ressource pouvant être dessinée avec une forme type et l'utiliser avec la méthode setBackgroundResource.

red_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle"> 
    <solid Android:color="#FF0000"/>    
</shape>

Activité:

Button b = (Button)findViewById(R.id.myButton);
b.setBackgroundResource(R.drawable.red_background);

Mais cela aura l'air plutôt mauvais, plat et hors de propos. Si vous voulez un bouton coloré qui ressemble à un bouton, vous pouvez le concevoir vous-même (coins arrondis, contour, fond dégradé ...) ou une solution rapide et sale consiste à ajouter un filtre PorterDuff à l'arrière-plan du bouton:

Button b = (Button)findViewById(R.id.myButton);
PorterDuffColorFilter redFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
b.getBackground().setColorFilter(redFilter);
1

Depuis après Android 16, le setBackgroundDrawable est obsolète, j'ai suggéré de vérifier avant de définir le code

vous devez également vérifier la version actuelle d'Android

Button bProfile; // your Button
Bitmap bitmap; // your bitmap

if(Android.os.Build.VERSION.SDK_INT < 16) {
    bProfile.setBackgroundDrawable(new BitmapDrawable(getResources(), bitmap));
}
else {
    bProfile.setBackground(new BitmapDrawable(getResources(),bitmap));
}
0
Sruit A.Suk