Как Загрузить Фон Макета С Помощью Picasso


Может ли кто-нибудь указать мне на пример того, как можно изменить фон XML-макета программно, используя Picasso? Все примеры, которые я нашел, могут обновить ImageView, используя Picasso,но не фон макета.

Невозможно установить LinearLayout BackgroundResource из URL с помощью Picasso

4 11

4 ответа:

Вы можете использовать мишень Пикассо:

         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) {

            }
        });

Обновить

Как упоминалось в комментарии @BladeCoder, Picasso содержит слабую ссылку на целевые объекты, следовательно, это, скорее всего, мусор.

Итак, следуя комментарию Джейка Уортона по одному из вопросов, я думаю, что это может быть хорошим способом:

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

Я использую ImageView как временный ImageHolder. Сначала загрузите изображение с Пикассо в ImageView и установите фон макета из этого ImageView с помощью 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() {

                        }
                    });

Ни одно из вышеперечисленных решений не сработало для меня. Но решение @Thiha было самым близким. Нижеследующее сработало для меня:

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

В моем случае мне нужно было, чтобы изображение соответствовало размеру imageview, поэтому вместо загрузки изображения в фоновом режиме я добавил Это свойство к imageview и загрузил изображение нормально.

android:scaleType="fitXY"