Невозможно установить 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;
}
}