setBackgroundResource () отбрасывает мои атрибуты макета XML - PullRequest
69 голосов
/ 05 мая 2011

У меня есть представление, которое используется как элемент в ListView. В моем собственном адаптере я изменяю фон вида, используя View.setBackgroundResource(), в зависимости от положения элемента в списке. (У меня есть отдельные активы для первого и последнего элементов в списке.)

Это устанавливает правильное фоновое изображение, как и ожидалось, но имеет неприятный побочный эффект, заключающийся в том, что все отступы, которые я установил в определении представления XML, полностью игнорируются.

(Если я устанавливаю фон для рисования в XML и не пытаюсь изменить его во время выполнения в адаптере, все отступы работают нормально.)

Как изменить фоновое изображение и сохранить отступы? Это ошибка?

РЕДАКТИРОВАТЬ кажется, что кто-то еще нашел здесь ту же проблему: Меняет ли изменение фона также заполнение LinearLayout?

Ответы [ 5 ]

105 голосов
/ 05 мая 2011

Я тоже столкнулся с этой проблемой.Предположительно вы используете ресурс LayerList Drawable?Это то, что я использовал.К сожалению, я не нашел «реального» способа исправить это, это похоже на ошибку в коде, но я не преследовал ее.Тем не менее, мне повезло в том смысле, что я устанавливал «глючный» фон после того, как мое представление уже было правильно отрисовано, так что это был просто вопрос сохранения, а затем восстановления значений отступов после установки фона, например:

  if(condition) {
    int bottom = theView.getPaddingBottom();
    int top = theView.getPaddingTop();
    int right = theView.getPaddingRight();
    int left = theView.getPaddingLeft();
    theView.setBackgroundResource(R.drawable.entry_bg_with_image);
    theView.setPadding(left, top, right, bottom);
  }

РЕДАКТИРОВАТЬ: В качестве альтернативы вам не нужно использовать предыдущие значения отступа, вы также можете использовать значение измерения:

  int pad = resources.getDimensionPixelSize(R.dimen.linear_layout_padding);
  theView.setBackgroundResource(R.drawable.entry_bg_with_image);
  theView.setPadding(pad, pad, pad, pad);
11 голосов
/ 08 апреля 2013

В дополнение к тому, что предложил dmon, вот функция, которую вы можете просто добавить в свой класс утилит, чтобы вам не приходилось прыгать через обручи каждый раз, когда вы обновляете ресурс. Это на самом деле просто его код, заключенный в функцию.

public static void updateBackgroundResourceWithRetainedPadding(View view, int resourceID)
{
    int bottom = view.getPaddingBottom();
    int top = view.getPaddingTop();
    int right = view.getPaddingRight();
    int left = view.getPaddingLeft();
    view.setBackgroundResource(resourceID);
    view.setPadding(left, top, right, bottom);
}
7 голосов
/ 30 марта 2015

Это исправлено в Lollipop, поэтому

public static void setBackgroundResource(@NonNull View view, @DrawableRes int resId) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        int paddingTop = view.getPaddingTop();
        int paddingLeft = view.getPaddingLeft();
        int paddingRight = view.getPaddingRight();
        int paddingBottom = view.getPaddingBottom();
        view.setBackgroundResource(resId);
        view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
    } else {
        view.setBackgroundResource(resId);
    }
}
6 голосов
/ 30 августа 2011

Другое решение, которое я выбрал вместо получения и установки отступа в коде, который предложил dmon, не использует заполнение и вместо этого использует поля для внутренних элементов.

В зависимости от вашего макета, это может бытьтакое же количество кода XML и не потребует никакой Java вообще.Мне это кажется немного грязнее, но не так грязно, как повсеместное добавление этого Java-кода.

0 голосов
/ 23 сентября 2013

В Monodroid, если я отправляю вызов в SetBackgroundResource, то верхний и нижний отступы остаются неизменными

private EditText _etInput

public void Disable()
{
    _etInput.Post(() => {
        _etInput.SetBackgroundResource(Resource.Drawable.input_field_background_disabled);
        _etInput.Clickable = false;
});

Однако, левый отступ сбрасывается в 0!?Если он не опубликован, то все отступы сбрасываются на 0.

Думал, что это интересная находка, о которой стоит написать ...

...