Quelqu'un peut-il m'indiquer un exemple de modification de l'arrière-plan d'une mise en page XML programmée à l'aide de Picasso? Tous les exemples que j'ai trouvés sont capables de mettre à jour un ImageView à l'aide de Picasso - mais pas un fond de mise en page.
Impossible de définir LinearLayout BackgroundResource à partir d'une URL à l'aide de Picasso
Vous pouvez utiliser la cible de Picasso:
Picasso.with(this).load("http://imageUrl").into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mYourLayout.setBackground(new BitmapDrawable(bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
METTRE À JOUR
Comme @BladeCoder l'a mentionné dans le commentaire, Picasso conserve une faible référence aux objets cible et est donc susceptible d'être récupéré.
Donc, après commentaire de Jake Wharton sur l'un des problèmes, je pense que cela pourrait être une bonne solution:
CustomLayout mCustomLayout = (CustomLayout)findViewById(R.id.custom_layout)
Picasso.with(this).load("http://imageUrl").into(mCustomLayout);
CustomLayout.Java:
public class CustomLayout extends LinearLayout implements Target {
public CustomLayout(Context context) {
super(context);
}
public CustomLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
setBackground(new BitmapDrawable(getResources(), bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
//Set your error drawable
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
//Set your placeholder
}
}
J'utilise un ImageView comme ImageHolder temporaire. Dans un premier temps, chargez l'image avec picasso dans ImageView et définissez le fond de disposition à partir de cette ImageView à l'aide de getDrawable.
ImageView img = new ImageView(this);
Picasso.with(this)
.load(imageUri)
.fit()
.centerCrop()
.into(img, new Callback() {
@Override
public void onSuccess() {
myLayout.setBackgroundDrawable(img.getDrawable());
}
@Override
public void onError() {
}
});
Aucune des solutions ci-dessus n'a fonctionné pour moi. Mais la solution de @ Thiha était la plus proche. Le ci-dessous a fonctionné pour moi:
final ImageView img = new ImageView(this);
Picasso.with(img.getContext()).load(url).into(img, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
collapsingToolbarLayout.setBackgroundDrawable(img.getDrawable());
}
@Override
public void onError() {
}
});
Dans mon cas, j'avais besoin que l'image corresponde à la taille de la imageview. Au lieu de charger l'image en arrière-plan, j'ai ajouté cette propriété à l'imageview et chargé l'image normalement.
Android:scaleType="fitXY"