Reputation: 5083
I trying to get access to the variable from the callback.
var dialog = showDialog(View.OnClickListener { dialog.dismiss() })
But dialog is shown as error with message 'Unresolved reference: dialog'
This is whole code fow showing full picture:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonOne.setOnClickListener {
showDialog(View.OnClickListener { Toast.makeText(this@MainActivity, "Button one clicked", Toast.LENGTH_LONG).show() })
}
buttonTwo.setOnClickListener {
var dialog = showDialog(View.OnClickListener { dialog.dismiss() })
}
}
private fun showDialog(clickListener: View.OnClickListener): Dialog {
val alertDialog = AlertDialog.Builder(this@MainActivity).create()
alertDialog.setTitle("This is title")
alertDialog.setMessage("This is message")
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK") { _, _ -> clickListener.onClick(null) }
alertDialog.show()
return alertDialog
}
}
Yes I can call to dismiss dialog
alertDialog.dismiss()
inside showDialog method. But click behaviour can be different in different cases.
So my question: how to get access to the variable from callback?
Upvotes: 0
Views: 1243
Reputation: 41
Using Anko and Kotlin's syntax it is possible to make the code more simpler and compact:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonOne.setOnClickListener { showDialog { toast("Button one clicked") } }
buttonTwo.setOnClickListener { showDialog { it.dismiss() } }
}
private fun showDialog(func: (DialogInterface) -> Unit) =
alert(Appcompat, "This is message") {
title = "This is title"
okButton { func(it) }
}.show()
}
Upvotes: 0
Reputation:
Is this what you want:
class MainActivity : AppCompatActivity() {
lateinit var dialog: Dialog
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonOne.setOnClickListener {
showDialog(View.OnClickListener { Toast.makeText(this@MainActivity, "Button one clicked", Toast.LENGTH_LONG).show() })
}
buttonTwo.setOnClickListener {
dialog = showDialog(View.OnClickListener { dialog.dismiss() })
}
}
private fun showDialog(clickListener: View.OnClickListener): Dialog {
val alertDialog = AlertDialog.Builder(this@MainActivity).create()
alertDialog.setTitle("This is title")
alertDialog.setMessage("This is message")
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK") { _, _ -> clickListener.onClick(null) }
alertDialog.show()
return alertDialog
}
}
Now you can access dialog
everywhere in MainActivity
Upvotes: 3