2017-12-12 2 views
1

databinding을 공부함으로써 운동을 시작하는 간단한 활동을 만들었습니다. 그리고이 다음과 같은 코드 :텍스트의 활동이 변경되지 않는 이유는 무엇입니까?

MainActivity : 클릭에 대한

class MainActivity : AppCompatActivity() { 
    val users = UserProfile("First Name","Last Name","Off",false) 
    val handlerbtn = HandlerButtonClick() 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main) 
     binding.user = users 
     binding.handler = handlerbtn 

    } 
} 

등급 :

class HandlerButtonClick { 
    fun onClickButton(view: View, user: UserProfile) { 
     var msg = "" 
     if(!user.isOnline){ 
      msg = "Online" 
      user.firstName = "Henrique" 
      user.lastName = "Mendes" 
      user.status = "Online" 
      user.isOnline = true 

     }else{ 
      msg = "Offline" 
      user.firstName = "First Name" 
      user.lastName = "Last Name" 
      user.status = "Offline" 
      user.isOnline = false 
     } 

     Toast.makeText(view.context, msg, Toast.LENGTH_SHORT).show() 
    } 
} 

USERPROFILE 등급 :

class UserProfile { 
    var firstName: String = "" 
    var lastName: String = "" 
    var status: String = "" 
    var isOnline: Boolean = false 

    constructor(firstNames: String, lastNames: String, statuss: String, isOnlines: Boolean) { 
     this.firstName = firstNames 
     this.lastName = lastNames 
     this.status = statuss 
     this.isOnline = isOnlines 
    } 
} 

XML :

<?xml version="1.0" encoding="utf-8"?> 

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data> 

     <variable 
      name="user" 
      type="com.dev.bob.testdatabinding2.UserProfile" /> 
     <variable 
      name="handler" 
      type="com.dev.bob.testdatabinding2.HandlerButtonClick" /> 
    </data> 

    <LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     tools:context="com.dev.bob.testdatabinding2.MainActivity"> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="1.0dp" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="10dp" 
      android:background="@{[email protected]/colorGreen : @color/colorAccent}" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:text="@{user.firstName}" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:text="@{user.lastName}" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:text="@{user.status}" /> 

     <Button 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="@{(view)-> handler.onClickButton(view, user)}"/> 

    </LinearLayout> 
</layout> 

토스트는, 즉, 변수 msg 변화를 잘 작동합니다. 그러나 화면의 텍스트는 바뀌지 않습니다. 각 조건에 따라 변경되도록하려면 어떻게해야합니까 (If/else)?

내가 무슨 말을, 버튼을 클릭하여, firstName 헨리 또는 (다시) 이름

+0

MainActivity에서'user' 변수와 일치하는지 확인하기 위해'user' 값을 검사하기 위해 디버깅을 시도 했습니까? – nhoxbypass

+0

변수는 XML에서 명시적인 변수이므로 동일합니다. 하지만 내가 어떻게 알 수 있니? Handler 클래스에서 값이 변경되었습니다. –

답변

3

그것은 올바른 방법으로 행동에 변경되지 않습니다. document에서 :

데이터 바인딩에 사용할 수있다

모든 평범한 구식 자바 객체 (POJO), 그러나 POJO를 수정 UI를 업데이트 발생하지 않습니다. 데이터 바인딩의 진정한 힘은 데이터 개체에 데이터가 변경 될 때 에게 알리는 기능을 부여하여 사용할 수 있습니다. 데이터 변경 알림 메커니즘에는 관찰 가능한 개체, 관찰 가능한 필드 및 관찰 가능한 컬렉션이라는 세 가지 데이터 변경 알림 메커니즘이 있습니다.

또는 당신은 this 신속하고 더러운 방법을 사용하여 바인딩 양방향 데이터를 시도 할 수 있습니다 :

귀하의 태그 android:text@: 후하는 =이 없습니다. android:text="@={user.firstName}"이어야합니다. @={}은 "양방향 데이터 바인딩"을 의미합니다. @{}은 단방향 데이터 바인딩입니다.

예 :

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="10dp" 
    android:text="@={user.firstName}" /> 
+0

언급 한대로 변경했으나 작동하지 않았습니다. 내가 잘못하고있는 것이 있습니다. –

+0

@HenriqueMendes 전체 접근법을 잊어 버렸습니다 : https://www.bignerdranch.com/blog/two-way-data-binding-on-android-observing-your-view-with-xml/. – nhoxbypass

+0

POJO가 당신을 위해 "자동 업데이트"할 수 있다고 생각 하나, 당신의 질문에 답한 것은 아닙니다. 문서에서 Google이 권장하는 3 가지 표준 방식 중 하나를 따라야합니다. – nhoxbypass

1

그냥 변수에 새 값을 할당하고 UI에 변화를 관찰 할 수 없다. 어떻게 든 "데이터 바인딩"에 통보해야합니다. 그것을 할 수있는 방법은 거의 없습니다.

class MainActivity : AppCompatActivity() { 
    val users = UserProfile("First Name","Last Name","Off",false) 
    lateinit var handlerbtn: HandlerButtonClick 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     val binding: ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main) 
     binding.user = users 
     handlerbtn = HandlerButtonClick(binding) 
     binding.handler = handlerbtn 
    } 
} 

는 그런 다음 HandlerButtonClick을 변경해야합니다 :

class UserProfile : BaseObservable { 

    @get:Bindable 
    var firstName: String = "" 
     set(value) { 
      notifyPropertyChanged(BR.firstName) 
     } 

    @get:Bindable 
    var lastName: String = "" 
     set(value) { 
      notifyPropertyChanged(BR.lastName) 
     } 

    ... do same for other fields ... 

    constructor(firstNames: String, lastNames: String, statuss: String, isOnlines: Boolean) { 

     this.firstName = firstNames 
     this.lastName = lastNames 
     this.status = statuss 
     this.isOnline = isOnlines 
    } 
} 

두 번째는 새로운 UserProfile 변경 후 ActivityMainBinding에 할당되어 일부 속성이 변경 될 때

첫 번째 사용자 프로필이 BaseObservable을 확장하고 통지하는 것입니다 수업 :

class HandlerButtonClick(val binding: ActivityMainBinding) { 
    fun onClickButton(view: View, user: UserProfile) { 
     var msg = "" 
     if(!user.isOnline){ 
      //changes 
     }else{ 
      //changes 
     } 
     binding.users = user 
     Toast.makeText(view.context, msg, Toast.LENGTH_SHORT).show() 
    } 
} 
+0

아주 좋은 대답입니다! 고맙습니다! –

관련 문제