Development Tip

setBackgroundResource ()는 내 XML 레이아웃 속성을 버립니다.

yourdevel 2020. 11. 4. 20:53
반응형

setBackgroundResource ()는 내 XML 레이아웃 속성을 버립니다.


에서 항목으로 사용되는보기가 ListView있습니다. 사용자 지정 어댑터 View.setBackgroundResource()에서 목록의 항목 위치에 따라 보기의 배경을 변경 합니다. (목록의 첫 번째 항목과 마지막 항목에 대해 별도의 자산이 있습니다.)

이것은 예상대로 올바른 배경 이미지를 설정하지만 뷰의 XML 정의에서 설정 한 모든 패딩이 완전히 무시된다는 불쾌한 부작용이 있습니다.

(XML에서 배경 드로어 블을 설정하고 어댑터에서 런타임에 변경하지 않으면 패딩이 모두 제대로 작동합니다.)

배경 이미지를 변경하고 패딩을 유지하려면 어떻게해야합니까? 이것은 버그입니까?

편집 다른 사람이 여기에서 동일한 문제를 발견 한 것 같습니다 . 배경을 변경하면 LinearLayout의 패딩도 변경됩니까?


이 문제도 만났습니다. 아마도 LayerList 리소스 드로어 블을 사용하고 있습니까? 그게 제가 사용하고 있던 것입니다. 불행히도 나는 그것을 고칠 수있는 "진짜"방법을 찾지 못했습니다. 그것은 코드의 버그처럼 보이지만 그것을 추적하지는 않았습니다. 그러나 뷰가 이미 제대로 렌더링 된 후 "버기"배경을 설정하고 있다는 점에서 운이 좋았습니다. 따라서 배경이 설정된 후 패딩 값을 저장 한 다음 복원하면됩니다. 예 :

  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);

dmon이 제안한 것에 덧붙여서, 여기에 util 클래스에 던질 수있는 함수가 있습니다. 따라서 리소스를 업데이트 할 때마다 험난한 일을 할 필요가 없습니다. 이것은 실제로 그의 코드가 함수로 래핑 된 것입니다.

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);
}

이것은 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);
    }
}

dmon이 제안한 코드에서 패딩을 가져오고 설정하는 대신 선택한 또 다른 솔루션은 패딩을 사용하지 않고 대신 내부 요소에 여백을 사용하는 것입니다.

레이아웃에 따라 실제로는 동일한 양의 XML 코드 일 수 있으며 Java가 전혀 필요하지 않습니다. 나에게 조금 더럽게 느껴지지만 Java 코드를 모든 곳에 추가하는 것만 큼 더럽지는 않습니다.


Monodroid에서 SetBackgroundResource에 대한 호출을 게시하면 상단 패딩과 하단 패딩이 변경되지 않은 상태로 유지됩니다.

private EditText _etInput

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

그러나 왼쪽 패딩은 0으로 재설정됩니다!? 게시되지 않은 경우 모든 패딩이 0으로 재설정됩니다.

Thought this to be an interesting find worth posting about ...

참고URL : https://stackoverflow.com/questions/5890379/setbackgroundresource-discards-my-xml-layout-attributes

반응형