2017-02-11 3 views
0

리사이더보기의보기 홀더에서 데이터 빙을 사용합니다. 비활성 행을 표시하기 위해 전경을 색상으로 설정했으며 내 Nexus6 및 기타 여러 기기에서 완벽하게 작동합니다.데이터 바인딩을 사용하는 포어 그라운드가 일부 장치에서 작동하지 않습니다.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:foreground="@{subscribed.isAutoRenew() ? @color/transparent : @color/bg_inactive}"> 
     other stuff ... 
</RelativeLayout> 

이 코드는 android 5.0이 설치된 Samsung SM-N900에서 작동하지 않습니다. 데이터 바인딩 대신 자바 코드를 사용하여 해결할 수 있습니다. 어떤 제안이라도 데이터 바인딩으로 어떻게 해결할 수 있을까요?

+1

당신이 게시시겠습니까 당신이 일 것을 사용중인 자바 코드? 데이터 바인딩은'view.setForeground (new ColorDrawable (view.getResources(). getColor (R.color.transparent)))')에 해당하는 것을 사용합니다. 자바 코드가 다른 경우 해당 자바 코드를 시도해보고 실패했는지 확인하십시오. –

+0

내가 언급 한 것과 동일한 코드를 사용 했으므로 작동합니다. 여기서는 상대 레이아웃을 프레임 레이아웃으로 둘러 쌌다. 상대 레이아웃의 setForground 메소드에는 API 레벨 23이 필요하기 때문이다. – hadilq

답변

1

데이터 바인딩은 이전 플랫폼에는없는 메서드 호출을 방지합니다. 테스트중인 기기가 API 23 (마시맬로)보다 오래된 경우 setForeground()에 전화하기를 거부합니다. Data Binding은 RelativeLayout에 전경 기능을 부여하는 마법 같은 방법이 아니므로 Java 코드에서 수행해야하는 작업을 수행해야합니다. 레이아웃에 FrameLayout 래퍼를 지정하고 포 그라운드를 할당합니다.

<FrameLayout ... 
    android:foreground="@{subscribed.isAutoRenew() ? @color/transparent : @color/bg_inactive}"> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/white"> 
    other stuff ... 
    </RelativeLayout> 
</FrameLayout> 

- 편집 -

주석을 바탕으로, 그래서, 그것은 View.setForeground()의 버전을 감지하고는 API (23)는 것을 볼 수있는 데이터 바인딩에 버그가 있어야한다는 결론을 내려야 그것을 건너 뜁니다. FrameLayout.setForegound()을 확인하면 안됩니다. 나는 이것에 버그를 제기 할 것이다.

그 동안

, 당신은 당신의 자신의 BindingAdapter를 작성하여 해결할 수 있습니다

@BindingAdapter("android:foreground") 
public static void setForeground(FrameLayout view, Drawable drawable) { 
    view.setForeground(drawable); 
} 
+0

위에서 언급했듯이, 나는 그것을 시험해 보았고 그 특별한 장치에서는 작동하지 않았다. 그래서 자바 코드로 구현해야했습니다. – hadilq

+0

BindingAdapter에 감사드립니다! 이상하게도 Android Studio (3.0.1)를 사용하지 않아도되지만 Intellij (2017.2.5)에서는 필요했습니다. 매우 동일한 PC 및 동일한 코드. 이상한. –

관련 문제