如何在android中将参数传递给对话框?

Aks*_*ngh 2 android android-dialogfragment kotlin

我正在调用一个带有参数的对话框,如下所示:

MyDialog("title", "message").show(this@MyActivity.supportFragmentManager, null)
Run Code Online (Sandbox Code Playgroud)

这是我的对话类:

class MyDialog(private val theTitle: String, private val theMessage: String) : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
            val myBuilder = AlertDialog.Builder(it)
            myBuilder
                .setTitle(theTitle)
                .setMessage(theMessage)
                .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当设备的方向在旋转时发生变化时,应用程序将停止工作。如果没有传递参数,则不会发生这种情况。那么,如何传递参数以及这样做的最佳方法是什么?

Abn*_*cio 7

使用 kotlin 的完整解决方案

第 1 步:创建您的课程,如下所示

class MyDialog : DialogFragment() {

    private var title: String? = null
    private var message: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            title = it.getString(ARG_TITLE)
            message = it.getString(ARG_MESSAGE)
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
            val myBuilder = AlertDialog.Builder(it)
                myBuilder
                    .setTitle(title)
                    .setMessage(message)
                    .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }

    companion object {
        const val TAG = "myDialog"
        private const val ARG_TITLE = "argTitle"
        private const val ARG_MESSAGE = "argMessage"

        fun newInstance(title: String, message: String) = MyDialog().apply {
            arguments = Bundle().apply {
                putString(ARG_TITLE, title)
                putString(ARG_MESSAGE, message)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤 2.创建实例并显示

MyDialog.newInstance("title", "message").show(this@MyActivity.supportFragmentManager, MyDialog.TAG)
Run Code Online (Sandbox Code Playgroud)

就这样了!


Jud*_*t K 5

如果它是一个片段,那么应该总是有一个可用的默认构造函数。单独传递参数将确保参数在片段的状态更改中保留
因此有一个方法 setArgument(Bundle) 您可以在其中传递参数。所以在这里你的电话应该改写为

class MyDialog: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity.let {
             val arg = arguments
            // Use the parameters by accessing the key from variable "arg"
            val myBuilder = AlertDialog.Builder(it)
            myBuilder
                .setTitle(theTitle)
                .setMessage(theMessage)
                .setPositiveButton("OK") { _, _ -> }
            myBuilder.create()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼你 Dialog:

val d = MyDialog()
val b = Bundle()
b.putInt("KEY1",1)
d.arguments = b
d.show(FragmentManager,Tag)
Run Code Online (Sandbox Code Playgroud)

对于任何片段总是记得使用参数来传递数据