Adil wahla
Adil wahla

Reputation: 21

could not get interface listener instanced in class

listener is unresolved i couldn't get why? tried differently but no proper solution

can anybody please tell me where is the problem why listener is red colored?

interface MessageListener(messageText: String) {

}
class SmsReceiver(listener: MessageListener) : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        val extras = intent.extras
        lateinit var number:TextView

        if(extras != null){
            val sms = extras.get("pdus") as Array<Any>

            for(i in sms.indices) {
                val format = extras.getString("format")

                val smsMessage = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    SmsMessage.createFromPdu(sms[i] as ByteArray, format)
                } else {
                    SmsMessage.createFromPdu(sms[i] as ByteArray)
                }
                val phoneNumber = smsMessage.originatingAddress
                val messageText = smsMessage.messageBody.toString()

               // Toast.makeText(context, "From: $phoneNumber Message: $messageText", Toast.LENGTH_LONG).show()
              // var a= Toast.makeText(context, "From: $phoneNumber Message: $messageText", Toast.LENGTH_LONG).show()
              //  number.text="$phoneNumber"
                listener=this.listener
               listener.onMessageReceived(phoneNumber, messageText)
            }

            }

        }

    companion object {
        class onMessageReceived(public val phoneNumber: String?, private val messageText: String) : listener.onMessageReceived("$phoneNumber $messageText")
    }

}

Upvotes: 0

Views: 129

Answers (4)

Akshay Kumar Both
Akshay Kumar Both

Reputation: 382

First of all. Interface does not have constructor with Parameters. Add a method to the Interface like below:

interface MessageListener {
   fun onMessageReceived(messageText: String)
}

then in your class just add "val" keyword to the listener instead of "listener=this.listener":

class SmsReceiver(val listener: MessageListener) : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        val extras = intent.extras
        lateinit var number: TextView

        if (extras != null) {
            val sms = extras.get("pdus") as Array<Any>

            for (i in sms.indices) {
                val format = extras.getString("format")

                val smsMessage = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                    SmsMessage.createFromPdu(sms[i] as ByteArray, format)
                else
                    SmsMessage.createFromPdu(sms[i] as ByteArray)

                val phoneNumber = smsMessage.originatingAddress
                val messageText = smsMessage.messageBody.toString()

                listener.onMessageReceived("$phoneNumber $messageText")
            }

        }

    }

}

Upvotes: 2

Dharmesh Prajapati
Dharmesh Prajapati

Reputation: 136

Change interface like this

Try this.

interface MessageListener {
  void onMessageReceived(messageText: String)
}
class SmsReceiver(listener: MessageListener) : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        val extras = intent.extras
        lateinit var number:TextView

        if(extras != null){
            val sms = extras.get("pdus") as Array<Any>

            for(i in sms.indices) {
                val format = extras.getString("format")

                val smsMessage = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    SmsMessage.createFromPdu(sms[i] as ByteArray, format)
                } else {
                    SmsMessage.createFromPdu(sms[i] as ByteArray)
                }
                val phoneNumber = smsMessage.originatingAddress
                val messageText = smsMessage.messageBody.toString()

               // Toast.makeText(context, "From: $phoneNumber Message: $messageText", Toast.LENGTH_LONG).show()
              // var a= Toast.makeText(context, "From: $phoneNumber Message: $messageText", Toast.LENGTH_LONG).show()
              //  number.text="$phoneNumber"

               listener.onMessageReceived("$phoneNumber $messageText")
            }

            }

        }

}

Upvotes: 0

jsamol
jsamol

Reputation: 3232

  1. Interfaces can't have constructors. They just can't store any state:

    Interfaces in Kotlin are very similar to Java 8. They can contain declarations of abstract methods, as well as method implementations. What makes them different from abstract classes is that interfaces cannot store state. They can have properties but these need to be abstract or to provide accessor implementations.

    An abstract class is probably what you should use in this case.

  2. Your code in the companion object just doesn't make sense. After : goes the extended type, not an instance or method invocation.

This should work:

abstract class MessageListener(protected val messageText: String) {

}
class SmsReceiver(listener: MessageListener) : BroadcastReceiver() {
    // onReceive

   class OnMessageReceived(val phoneNumber: String?, messageText: String) : MessageListener("$phoneNumber $messageText")
}

However I'm not sure I understand what you are trying to achieve.

Upvotes: 0

a_local_nobody
a_local_nobody

Reputation: 8191

change :

interface MessageListener(messageText: String) {

}

to

interface MessageListener {

}

interfaces don't have constructors, the syntax you're using is for a constructor

Upvotes: 1

Related Questions