Как изменить свойство EditText (для другого занятия) внутри класса? - PullRequest
0 голосов
/ 26 апреля 2019

Моя деятельность signUpClient.kt вызывает класс API, отправляя тексты EditText в API (в рамках модели, называемой клиентами):

signUpAPI.postClient (клиент)

Внутри этого API есть функция, которая публикует клиента (код ниже). Когда данное электронное письмо уже существует, сервер возвращает сообщение об ошибке. Я могу отобразить ошибку через Toast, передавая правильный контекст.

Дело в том, что я хочу указать пользователю, что поле email неверно, изменив свойство его EditText.

Я попытался получить доступ к его идентификатору из API, но он не получил к нему доступ.

Есть ли способ сделать это?

ПРИМЕЧАНИЕ. Я знаю, как изменить свойства EditText, проблема в том, как изменить его из другого класса (это даже не действие). Я попытался использовать findViewById безуспешно.

signup_client.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)
            }
        })
    }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

В идеале у вас не должно быть кода, который обращается к вашим представлениям в обратных вызовах API и не позволяет этим ссылкам на представления сохранять активность в течение периода, превышающего запланированный жизненный цикл. Вы также хотите, чтобы ваш сетевой код и просмотр кода были четко отделены.

Что вы можете сделать, это реализовать класс ViewModel с полями LiveData, которые содержат состояние вашего пользовательского интерфейса (включая ошибки). Затем ваша активность может наблюдать за этими полями LiveData и обновлять представления. В ViewModel вы также можете указать, чтобы ваш класс API выполнял реальный класс API, чьи обратные вызовы обновят поля LiveData ViewModel.

См. Эту информацию в документации для Android для получения дополнительной информации: https://developer.android.com/topic/libraries/architecture/viewmodel

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

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

0 голосов
/ 26 апреля 2019

Вы можете определить перечисление, в котором говорится, какая ошибка произошла следующим образом:

enum class ApiError {
   EMAIL_EXISTS, UNKNOWN
}

Тогда ваша функция postClient принимает функцию в качестве параметра:

fun postClient(client: Client, errorCallback: (ApiError, String) -> Unit)

Как только вы достигнете любой точки отказа, вы можете вызвать эту функцию, например:

errorCallback(ApiError.EMAIL_EXISTS, "The email already exists")

и когда вы вызываете функцию postClient, вы делаете это так:

postClient(client) { errorType, text ->
   if (errorType == ApiError.EMAIL_EXISTS) {
      emailErrorEditText.text = text
   }
}

Если у вас есть больше дел, уместно использовать когда утверждение . Концепция наличия функции в качестве параметра попадает в область функций более высокого порядка. Вы можете прочитать больше о них здесь . Они действительно очень полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...