Как установить растровое изображение для фона для Android API 10-18? - программирование
Подтвердить что ты не робот

Как установить растровое изображение для фона для 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, поэтому не могу принять большинство ответов здесь

4b9b3361

Ответ 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);
    }
}