Вызов функции активности из класса
Я использую 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
}