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

У меня есть linearLayout, я хотел бы изменить фон программно:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/downloadLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:weightSum="1" >
    ...

и я попытался установить фоновое изображение макета XML с помощью следующего:

LinearLayout linearLayout2 = (LinearLayout) findViewById(R.id.downloadLayout);
        int resId = getResources().getIdentifier(background,
                "drawable", getPackageName());

linearLayout2.setBackgroundResource (Resid);

Однако фоновое изображение никогда не загружается, нет NPE, изображение просто никогда не загружается. Любые предложения приветствуются.

Я сделал немного отладки, и в настоящее время у меня есть следующие значения:

        linearLayout2 = android.widget.LinearLayout{529b3f58 V.E..... ......I. 0,0-0,0 #7f0a008e app:id/downloadLayout}
        background = http://xxx.xxx.x.xxx/bgs/big_lebowski_bg.jpg
        resID = 0

PS

Я также попытался выполнить то же самое с помощью Picasso - я не уверен, как обойти указанную ошибку и успешно ее загрузить:

Источник:

final LinearLayout downloadLayout = (LinearLayout) findViewById(R.id.downloadLayout);
Picasso.with(this).load("http://i.imgur.com/DvpvklR.png").into(downloadLayout);

Ошибка:

The method into(Target) in the type RequestCreator is not applicable for the arguments (LinearLayout)

2 ответа

Picasso работает только с ImageViews, а не с макетами.

Вы можете поместить ImageView в свой макет, настроить его в соответствии с шириной и высотой родителя и вставить изображение в ImageView.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/downloadLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1" >
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>

Это должно работать тогда:

ImageView imageView = (ImageView) findViewById(R.id.imageView);    
Picasso.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);

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

Пример ОБНОВЛЕН

Убедитесь, что у вас есть представление изображения в LinearLayout и пусть оно fill_parent (то есть LinearLayout), Пикассо не применимо к ImageView напрямую, следовательно, ошибка.

ImageView imageView = (ImageView) findViewById(R.id.imageView); 
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

АЛЬТЕРНАТИВЫ

LinearLayout linearLayout=(LinearLayout)findViewById(R.id.yourLinearLayoutid);
BitmapDrawable drawableBitmap=new BitmapDrawable(getBitmap(urlString));
linearLayout.setBackgroundDrawable(drawableBitmap);

Этот метод getBitMap, как и в библиотеке Пикассо, должен быть достаточным без использования библиотеки.

private Bitmap getBitmap(String url)
    {


        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
           return null;
        }
    }
Другие вопросы по тегам