0

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?

2 Answers 2

3

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

Sign up to request clarification or add additional context in comments.

Comments

0

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()
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.