Как использовать нестатический метод в Kotlin? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть один класс, который расширяет BroadcastReceiver. Поэтому, когда приходит сообщение, вызывается этот метод. Теперь в этом методе я вызываю метод другого класса, чтобы установить текст в EditText. Но так как я использую kotlin, мне нужно использовать статический метод в объекте-компаньоне. Итак, как мне вызвать setText для моего EditText в этом методе или где-то еще?

Мой BroadcastReceiver Класс:

class SMS : BroadcastReceiver() {

    val OTP_REGEX = "[0-9]{1,6}"

    override fun onReceive(context: Context, intent: Intent) {
        Log.e("onReceive", "==->$intent")

        val bundle = intent.extras
        try {
            if (bundle != null) {
                Log.e("onReceive", "==->$bundle")
                val pdusObj = bundle.get("pdus") as Array<Any>
                for (i in pdusObj.indices) {
                    val currentMessage = SmsMessage.createFromPdu(pdusObj[i] as ByteArray)
                    val phoneNumber = currentMessage.displayOriginatingAddress
                    val senderNum = phoneNumber
                    val message = currentMessage.displayMessageBody

                    Log.e("getMessage", "===->$message")

                    try {
                        VerifyOTPActivity.ReceievdMsg(message);
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

} 

Класс, в котором мне нужно установить это сообщение в тексте редактирования.

class VerifyOTPActivity : AppCompatActivity()  {

    companion object {

        @JvmStatic
        fun ReceievdMsg(message: String) {
            var otp = ""
            val OTP_NUMBERS = "[0-9]{1,6}"
            val pattern = Pattern.compile(OTP_NUMBERS)
            val matcher = pattern.matcher(message)

            while (matcher.find()) {
                otp = matcher.group()
            }

            try {
               // edt.setText(otp) // Edit text
            } catch (e: Exception) {

            }
        }

    }

    var mobileNo: String = ""

    var preference: AppPreference? = null
    lateinit var adminAPI: AdminAPI
    lateinit var customDialog: CustomDialog

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_verify_otp)

        preference = Utils.getAppPreference(applicationContext)
        adminAPI = ServiceGenerator.getAPIClass()
        customDialog = CustomDialog(this)
        customDialog.setCancelable(false)

        val intent: Intent = intent

        mobileNo = intent.getStringExtra("mobileNo")

        workonIds()
        setupToolBar()
    }

    private fun setupToolBar() {
        txt_toolbar_title.gravity = Gravity.CENTER
    }

    private fun workonIds() {
        txt_mobile_no.setText(mobileNo)

        txt_mobile_no.setOnClickListener{
            onBackPressed()
        }

        layout_next.setOnClickListener {
            val getOTP = edt_otp.text.toString().trim()
            val getMobileNo = txt_mobile_no.text.toString().trim()

            if (getOTP.isEmpty()) {
                C.showToast(applicationContext, resources.getString(R.string.emptyotp))
            } else if (getOTP.length < 6) {
                C.showToast(applicationContext, resources.getString(R.string.validotp))
            } else {
                verifyOTP(getMobileNo , getOTP)
            }
        }
    }

    private fun verifyOTP(mobileNo: String, otp: String) {
        customDialog.show()
        val sendOTP : Call<AppModel> = adminAPI.VerifyOTP(mobileNo , otp)
        sendOTP.enqueue(object : Callback<AppModel> {
            override fun onFailure(call: Call<AppModel>?, t: Throwable?) {
                customDialog.dismiss()
                C.errorToast(applicationContext , t)
            }

            override fun onResponse(call: Call<AppModel>?, response: Response<AppModel>?) {
                customDialog.dismiss()
                val appModel : AppModel = response!!.body()!!
                if (appModel != null) {
                    if (appModel.isStatus) {
                        val intent = Intent(applicationContext, UserRegistrationActivity::class.java)
                        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
                        preference!!.verify = true
                        preference!!.mobileNumber = mobileNo
                        intent.putExtra("mobileNo", mobileNo)
                        startActivity(intent)
                    } else {
                        C.showToast(applicationContext , appModel.message)
                    }
                } else {
                    C.defaultError(applicationContext)
                }
            }
        })
    }

}

Как мне установить это сообщение в моем EditText?

Ответы [ 2 ]

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

Вы можете настроить шину событий, которая является одиночной. Таким образом, с вашего BroadcastReceiver вы можете отправлять события на шину, а с вашего Activity / Fragment / Whatever вы можете подписаться на эти события и реагировать соответственно

Вы можете проверить некоторые библиотеки, такие как EventBus или Otto , хотя я настоятельно рекомендую RxJava . Это немного сложнее, но гораздо мощнее

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

Вы можете создать внутренний класс в VerifyOTPActivity и расширить его на BroadcastReceiver.Чем внутри вашего onReceive() вы будете иметь доступ к вашему экземпляру VerifyOTPActivity и сможете позвонить на findViewById(), чтобы получить ваш TextView экземпляр для записи вашего текста.Конечно, вы должны позвонить registerReceiver() внутри onCreate() ваших VerifyOTPActivity и unregisterReceiver() внутри onDestroy()

Другими словами, просто сделайте ваш приемник SMS braodcast внутренним для VerifyOTPActivity и привяжите егорегистрация в жизненном цикле деятельности

...