2016-06-02 9 views
8

나는 그렇게처럼 내 ToggleButton의 "확인"속성에 바인딩 내 활동 클래스에 ObservableBoolean 필드가 :ToggleButton으로 양방향 데이터 바인딩을 수행하는 방법은 무엇입니까?

android:checked="@{activity.editing}" 

나는이 버튼과 사이에 양방향 관계를 만들 것이라고 기대했다 boolean이지만 필드에서 단추로 변경 사항 만 전달합니다. 내가 뭘 잘못하고 있는거야, 아니면 안드로이드의 범위에 있지 않은가 DataBinding?

답변

18

당신이해야 할 또 다른 '='당신이 양방향 데이터 바인딩 사용하도록 안드로이드에게 :

2 : 당신이 in the wordpress article of George Mount에 대한 자세한 정보를 찾을 수 있습니다

android:checked="@={activity.editing}" 

을 - 웨이 데이터 바인딩

안드로이드는 일반적인 데이터 엔트 리뷰 사용자 입력의 변경 사항을 다시 모델에 반영하는 것이 중요합니다. 예를 들어, 위의 데이터가 문의 양식에있는 경우 EditText에서 데이터를 가져올 필요없이 편집 된 텍스트를 모델로 다시 푸시해야 좋을 것입니다. 여기 당신이 그것을 할 방법은 다음과 같습니다

<layout ...> 
    <data> 
     <variable type="com.example.myapp.User" name="user"/> 
    </data> 
    <RelativeLayout ...> 
     <EditText android:text="@={user.firstName}" .../> 
    </RelativeLayout> 
</layout> 

꽤 멋진, 응? 유일한 차이점은 표현식이 대신 @={}으로 표시된다는 것입니다. 대부분의 데이터 바인딩은 계속해서 일방적으로 진행될 것이고 모든 리스너를 생성하고 결코 발생하지 않을 변경 사항을 관찰하지 않기를 바랍니다.

3

ObservableBoolean을 사용할 필요가 없으므로이 작업은 부울 변수의 일반 getter-setter 방법으로 수행 할 수 있습니다. 귀하의 모델 클래스에서 이것을 좋아하십시오

public class User{ 
    private boolean checked; 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 
} 

귀하의 ToggleButton에서 양방향 바인딩을 수행하십시오.

<ToggleButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="@={user.checked}"/> 

이 값을 바인딩 변수를 사용하여 가져옵니다.

binding.getUser().isChecked() 
+1

세터의 isChecked() 및 notifyPropertyChanged (BR.checked) 주석에'@ Bindable '주석이 없습니다. – saiyancoder

+1

@saiyancoder 나는 그것이 필요하다고 생각하지 않는다. –