简体   繁体   English

为什么数据不从 xml 传递到 Activity?

[英]Why data not pass from xml to Activity?

In my android app:在我的安卓应用中:

 dataBinding {
     enabled = true
 }

in my activity:在我的活动中:

class RegistrationActivity : RootActivity() {
    private lateinit var viewBinding: RegistrationActivityBinding // use "registration_activity.xml"
    private lateinit var registrationViewModel: RegistrationViewModel
    private var wallet = Wallet()

    companion object {
        private val TAG = RegistrationActivity::class.java.name
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Debug.d(TAG, "onCreate: savedInstanceState = $savedInstanceState")
        viewBinding = RegistrationActivityBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)        
        viewBinding.setVariable(BR.model, wallet)
        viewBinding.executePendingBindings() 

        init()
    }

    private fun init() {
        viewBinding.buttonRegistration.setOnClickListener {
            Debug.d(TAG, "initLogic: click_button, wallet = $wallet")
        }
    }
}

here my model:这是我的模型:

class Wallet() : Serializable {
    var email: String? = null
    var password: String? = null

    override fun toString(): String {
        return "\nWallet(email = $email, password = $password)"
    }
}

in xml:在 XML 中:

<data>

    <variable
        name="model"
        type="com.myproject.model.Wallet" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_color_bg">

    <include
        android:id="@+id/registrationToolbar"
        layout="@layout/tool_bar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:title="@{@string/registration}" />

    <EditText
        android:id="@+id/editTextEmail"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin"
        android:hint="@string/email"
        android:importantForAutofill="no"
        android:inputType="textEmailAddress"
        android:text="@{model.email}"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/registrationToolbar" />

    <EditText
        android:id="@+id/editTextPassword"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/default_margin"
        android:hint="@string/password"
        android:importantForAutofill="no"
        android:inputType="textPassword"
        android:text="@{model.password}"
        app:layout_constraintEnd_toEndOf="@+id/editTextEmail"
        app:layout_constraintStart_toStartOf="@+id/editTextEmail"
        app:layout_constraintTop_toBottomOf="@+id/editTextEmail" />

    <EditText
        android:id="@+id/editTextPasswordRetype"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/default_margin"
        android:hint="@string/retypePassword"
        android:importantForAutofill="no"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="@+id/editTextEmail"
        app:layout_constraintStart_toStartOf="@+id/editTextEmail"
        app:layout_constraintTop_toBottomOf="@+id/editTextPassword" />

    <com.google.android.material.button.MaterialButton
        android:id="@+id/buttonRegistration"
        android:layout_width="0dp"
        android:layout_height="@dimen/button_height"
        android:layout_margin="@dimen/default_margin"
        android:layout_marginBottom="@dimen/default_margin"
        android:text="@string/registration"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editTextPasswordRetype" />

    <include
        android:id="@+id/progressBarLayout"
        layout="@layout/progress_bar_layout"
        android:visibility="gone" />

</androidx.constraintlayout.widget.ConstraintLayout>

I input some email in editTextEmail and click button.我在editTextEmail中输入了一些电子邮件,然后单击按钮。 As result call method:结果调用方法:

viewBinding.buttonRegistration.setOnClickListener

Nice.好的。

But here log:但这里记录:

click_button, wallet = Wallet(email = null, password = null)

As you can see the email is null如您所见,电子邮件为

But I need pass email from xml to activity.但我需要将电子邮件从 xml 传递到活动。 I use viewbinding.我使用视图绑定。 Why email not pass to activity via this:为什么电子邮件不通过此传递给活动:

android:text="@{model.email}"

?

You have to use two way binding to back data from View to ViewModel .您必须使用两种方式绑定将数据从View返回到ViewModel Use @= to enable two way data binding in your xml like:使用@=在您的xml中启用两种方式的数据绑定,例如:

android:text="@={model.email}"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM