Reputation: 21
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
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
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
Reputation: 3232
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.
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
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