Как установить растровое изображение для фона для Android API 10-18?
У меня есть:
манифеста:
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18" />
Источник:
View view = createViewFromWhatever();
Bitmap bitmap = loadSomethingAddMore();
Всюду, где я искал это, принимается, предлагается:
view.setBackgroundDrawable(new BitmapDrawable(bitmap));
Но он устарел в API 18. Меня терроризируют фреймворки и пропущенные документы на уровне ОС. Я хочу уважать то, что они говорят, и в случае аварии "это не моя вина"
Я даже не могу использовать new BitmapDrawable(bitmap)
, а мне нужно new BitmapDrawable(getActivity().getResources(), bitmap)
. Если я поменяю свой метод на рекомендуемый способ: setBackground(new BitmapDrawable(getActivity().getResources(), bitmap));
Он будет отмечен как ошибка с сообщением:
Для вызова требуется уровень API 16 (текущий минимум равен 10): android.widget.RelativeLayout # setBackground
В качестве решения я мог проверить, какая версия работает у пользователя и делать if-else, чем у меня будет код с if(isAndroidVersion10()) else if () ...
Решение любого приемлемого решения?
Если я уйду из предупреждений об отказе от рефлексии через отражение, я все равно возьму на себя ответственность в случае сбоя, потому что у меня выпущен код с устаревшим методом! - как раз то, как я называю, отличается.
Если я проигнорирую этот Lint, он будет сбой при низкой версии api, проверен.
Ofc Я хочу поддерживать API 10, поэтому не могу принять большинство ответов здесь
Ответы
Ответ 1
Это было быстро, получилось от приемлемое решение
if (android.os.Build.VERSION.SDK_INT >= 16){
setBackgroundV16Plus(mRootView, bitmap);
}
else{
setBackgroundV16Minus(mRootView, bitmap);
}
@TargetApi(16)
private void setBackgroundV16Plus(View view, Bitmap bitmap) {
view.setBackground(new BitmapDrawable(getActivity().getResources(), bitmap));
}
@SuppressWarnings("deprecation")
private void setBackgroundV16Minus(View view, Bitmap bitmap) {
view.setBackgroundDrawable(new BitmapDrawable(bitmap));
}
Человек... простой setBackground()...
Google начал копировать нерабочие вещи из iOS (вращение, pushModal очень отличается в 4.3,5,6), ужасно для разработки нескольких версий
Ответ 2
Просто потому, что что-то устарело, это не значит, что он не работает. Из Просмотр источника определение setBackground
(с последней версии Android):
public void setBackground(Drawable background) {
//noinspection deprecation
setBackgroundDrawable(background);
}
Итак, на данный момент вы можете просто использовать setBackgroundDrawable
для всех уровней API. Это не означает, что проверка на SDK_INT не является хорошей идеей, так как будущие версии могут изменить способ работы setBackground
.
Ответ 3
Немного поздно для этой вечеринки, но мой друг, я думаю, что причины вашего сбоя - outOfMemoryExceptions, а не метод setBackground... убедитесь, что вы эффективно загружаете свои растровые изображения, прежде чем устанавливать их на задний план. Это может помочь здесь
Ответ 4
Если вы хотите избежать шаблона, опубликованного в принятом ответе, попробуйте следующее:
public static void setBitmapCompat(View view, Bitmap bitmap) {
BitmapDrawable bd = new BitmapDrawable(view.getContext().getResources(), bitmap);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(bd);
} else {
view.setBackgroundDrawable(bd);
}
}