为什么文本的活动没有变化?

时间:2017-12-12 12:50:50

标签: android kotlin

通过研究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="@{user.isOnline?@color/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>

toast工作正常,即变量msg发生变化。但我在屏幕上的文字没有改变。我该怎么做才能让它们根据每个条件(If / else)的内容进行更改?

我所说的是,点击按钮,firstName不会改为亨利或名字(再次)

2 个答案:

答案 0 :(得分:2)

它表现得很正确。来自document

  

任何普通的旧Java对象(PO​​JO)都可以用于数据绑定,但是   修改POJO不会导致UI更新。真正的力量   数据绑定可以通过赋予数据对象的能力来使用   数据更改时通知。有三种不同的数据更改通知机制,Observable对象,可观察字段和可观察集合。

或者您可以使用this快速而肮脏的方法尝试双向数据绑定:

在[{1}}之后,您的代码android:text缺少=。它应该是@:android:text="@={user.firstName}"表示“双向数据绑定”。 @={}是单向数据绑定。

例如:

@{}

答案 1 :(得分:0)

您不能只为变量分配新值并观察UI上的更改。你应该以某种方式通知“DataBinding”。有几种方法可以做到。

第一个是使UserProfile扩展BaseObservable并在某些属性发生变化时通知:

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

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:

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