Joe Rakhimov
Joe Rakhimov

Reputation: 5083

Kotlin - How to get access to variable from callback?

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

Answers (2)

Mario Salvatore
Mario Salvatore

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

user8959091
user8959091

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

Related Questions