首页 > 解决方案 > 如何更改类中的 EditText 属性(在另一个活动上)?

问题描述

我的活动signUpClient.kt调用 API 类,将 EditText 文本发送到 API(在称为客户端的模型中):

signUpAPI.postClient(客户端)

在这个 API 中,有一个发布客户端的函数(代码如下)。只要给定的电子邮件已经存在,服务器就会返回一条错误消息。我可以通过 Toast 显示错误,传递正确的上下文。

问题是:我想向用户表明该字段email不正确,更改其 EditText 的属性。

我试图从 API 访问它的 ID,但它没有访问它。

有没有办法做到这一点?

注意:我知道如何更改 EditText 属性,问题是如何从另一个类更改它(这甚至不是一个活动)。 我尝试使用findViewById不成功。

注册客户端.kt:

   btn_signup.setOnClickListener() {

       val name = et_name.text.toString()
       val email = et_email.text.toString()
       val cellphone = et_cellphone.text.toString()
       val birthdate = et_birthdate.text.toString()
       val password = et_password.text.toString()


       // Constructs a new client object
       val client = Client(
           name,
           email,
           cellphone,
           birthdate,
           password
       )

       signUpAPI = API(this)
       signUpAPI.postCliente(client)
}

API.kt:

   fun postCliente(cliente: Cliente) {

        val TAG = "API Activity"
        val apiInterface: ApiInterface
        apiInterface = ClientApi.getClient().create(ApiInterface::class.java)
        val clientePostCall = apiInterface.postCliente(cliente)
        mProgressBar.visibility = View.VISIBLE

        clientePostCall.enqueue(object: Callback<Cliente> {
            override fun onResponse(call: Call<Cliente>, response: Response<Cliente>) {
                mProgressBar.visibility = View.GONE
                if(response.isSuccessful){
                    try {
                        Toast.makeText(context,"User " + response.body()!!.name + " created successfully.",Toast.LENGTH_SHORT).show()
                        val backHomeIntent = Intent(context, MainActivity::class.java)
                        context.startActivity(backHomeIntent)
                    } catch (e: NullPointerException) {
                        Toast.makeText(context, "Problem is unknown: ", Toast.LENGTH_SHORT).show()
                    }
                }else {
                    try {
                        var jObjError = JSONObject(response.errorBody()!!.string())
                        var email = jObjError.getString("client_email")
                        Toast.makeText(context, "Email " + email + " já existe.", Toast.LENGTH_SHORT).show()

                    } catch (e: IOException){
                        Toast.makeText(context, "Problem is unknown: ", Toast.LENGTH_SHORT).show()
                    }
                }
            }
            override fun onFailure(call: Call<Cliente>, t: Throwable) {
                mProgressBar.visibility = View.GONE
                Log.e(TAG, "onFailure: " + t.localizedMessage)
            }
        })
    }

标签: androidkotlinretrofit2

解决方案


理想情况下,您不应该有代码在 API 回调中访问您的视图,以防止这些视图引用使您的 Activity 在其预期的生命周期之外保持活动状态。您还希望保持网络代码和视图代码干净地解耦。

您可以做的是实现一个 ViewModel 类,其中包含保存 UI 状态(包括错误)的 LiveData 字段。然后您的 Activity 可以观察这些 LiveData 字段并对视图进行更新。在 ViewModel 中,您还可以让 API 类执行实际的 API 类,其回调将更新 ViewModel 的 LiveData 字段。

有关更多信息,请参见 Android 文档: https ://developer.android.com/topic/libraries/architecture/viewmodel

https://developer.android.com/topic/libraries/architecture/livedata

https://developer.android.com/jetpack/docs/guide


推荐阅读