Вызов функции активности из класса

Я использую Kotlin в Android Studio, чтобы сделать приложение.

В моей основной деятельности у меня есть функция changeText (), которая изменяет текст текстового поля. У меня есть класс, который я реализую под названием VerificationListener (), который при создании будет делать вещи, а затем вызвать onVerified (), однако я не могу вызвать changeText из onVerified, есть ли способ сделать это? Пример, над которым я работаю, написан на Java и делает это.

Пример, над которым я работаю

public void onVerified() {
            mIsVerified = true;
            Log.d(TAG, "Verified!");
            hideProgressAndShowMessage(R.string.verified);
            showCompleted();}

Выше в классе, ниже просто сидит в деятельности

private void showCompleted() {
    ImageView checkMark = (ImageView) findViewById(R.id.checkmarkImage);
    checkMark.setVisibility(View.VISIBLE);
}

2 ответа

Решение

Если под "я не могу вызвать changeText from onVerified" вы имеете в виду, что у вас есть VerificationListener как отдельный автономный класс, и из этого класса вы не можете вызывать методы в Activity, вы должны либо: a) сделать VerificationListener внутренним классом Activity, b) передать свою деятельность в VerificationListener при ее создании (быть осведомленным о жизненном цикле) c) внедрить какое-либо решение для обмена сообщениями (широковещательный приемник, startActivity + onIntent(), observable или даже шину событий (не рекомендуется). Вот пример реализации для б:

class MyActivity : Activity(), VerificationListener.OnVerifiedCallback {

    fun onVerified() {
        changeText()
    }

    override fun onCreate(state: Bundle) {
        super.onCreate(state)

        VerificationListener(this).doStuff()

    }

}


class VerificationListener(internal var callback: OnVerifiedCallback) {
    interface OnVerifiedCallback {
        fun onVerified()
    }

    fun whenSomethingGetsVerified() {
        doThings()
        callback.onVerified()
    }
}

РЕДАКТИРОВАТЬ: забыл, что вы используете Kotlin, изменил реализацию Kotlin

Вы не можете получить доступ к интерфейсу из фонового потока, Kotlin или нет. Вы должны запустить это в потоке пользовательского интерфейса:

runOnUiThread {
    val checkMark: ImageView = findViewById(R.id.checkmarkImage)
    checkMark.visibility = View.VISIBLE
}
Другие вопросы по тегам