Вызов функции активности из класса - PullRequest
0 голосов
/ 11 мая 2018

Я использую 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 ]

0 голосов
/ 12 мая 2018

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

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

0 голосов
/ 12 мая 2018

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

runOnUiThread {
    val checkMark: ImageView = findViewById(R.id.checkmarkImage)
    checkMark.visibility = View.VISIBLE
}
...