setBackground из растрового API 22+
У меня есть приложение, которое может взять выбранное изображение из галереи пользователей и отобразить его в качестве фона в приложении. Я использовал код ниже с успехом.
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
BitmapDrawable drawable = new BitmapDrawable(getResources(), BitmapFactory.decodeFile(picturePath));
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
llmain.setBackgroundDrawable(drawable);
} else if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
llmain.setBackground(drawable);
}
Хотя, так как я обновил свое приложение до API 22, оно перестало работать. Я нашел, как установить фон с
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
llmain.setBackgroundDrawable(drawable);
} else if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
llmain.setBackground(drawable);
} else {
llmain.setBackground(ContextCompat.getDrawable(this, drawable));
}
Но это не работает, так как вызов ContextCompat.getDrawable() предназначен для контекста и целого, а не контекста и BitmapDrawable.
2 ответа
Немного измени свой код, надеюсь, это поможет тебе
Обновлено:
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
BitmapDrawable background = new BitmapDrawable(getApplicationContext().getResources(),bitmap);
llmain.setBackground(background);
Установить растровое изображение в качестве фона для линейного макета.
Непосредственно вы не можете установить растровое изображение в макет, поэтому вы должны использовать BitmapDrawable, который преобразует растровое изображение в рисованный.
BitmapDrawable background = new BitmapDrawable(bmImg);
linearLayout.setBackgroundDrawable(background);