在Kotlin中的android中创建对话框的好方法是什么?

时间:2019-06-10 13:25:59

标签: android kotlin android-dialogfragment

我有一个SettingsActivity.kt,如下:

class SettingsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setLayout()
        setListeners()

    }

    private fun setLayout() {/* fun to set layout* /}
    private fun setListeners() {
        val day = findViewById<LinearLayout>(R.id.settings_day)
        day.setOnClickListener { myDialog() }

        /* some other dialogs created in similar way */
    }

    private fun myDialog() {
        val prefs = getSharedPreferences("SETTINGS", Context.MODE_PRIVATE)
        var selectedDay = prefs.getInt("day", 1)

        val myBuilder = AlertDialog.Builder(this)
        myBuilder
            .setTitle(R.string.settings_day)
            .setSingleChoiceItems(R.array.days, selectedDay) { _, which ->
                selectedDay = which
            }
            .setPositiveButton(R.string.dialog_ok) { _, _ ->
                val editor = prefs.edit()
                editor
                    .putInt("day", selectedDay)
                    .apply()
            }
            .setNegativeButton(R.string.dialog_cancel) { _, _ -> /* do nothing */ } 

        val theDialog = myBuilder.create()
        theDialog.show()
    }
}

当设备方向改变时,对话框消失。

我认为我必须使用DialogFragment,但是我有一些问题, https://developer.android.com/guide/topics/ui/dialogs#kotlin上的官方指南没有太多解释。我很困惑将代码放置在哪里。

DialogFragment上的大多数教程都是针对自定义布局或Java的。

所以,有人可以告诉我如何转换代码 以便使用DialogFragment。 我很难从示例中理解它。

2 个答案:

答案 0 :(得分:1)

创建DialogFragment的子类并覆盖onCreateDialog()以返回您的AlertDialog,例如只需将您的myDialog代码移到myBuilder.create()

如果要显示DialogFragment,请实例化它并在其上调用show,同时传递对片段管理器的引用和(可选)标签。例如:

MyDialogFragment().show(requireFragmentManager(), null)

答案 1 :(得分:1)

如果您与Kotlin合作,Anko Library可能会让您感兴趣。它提供了一种创建警报,对话框和其他常见任务的简便方法。

  

Anko是Kotlin库,可以使Android应用程序开发更快,更轻松。它使您的代码干净且易于阅读,并让您无需理会Android SDK for Java的粗糙之处。

1-将Anko添加到您的项目中

要将Anko添加到您的Android Kotlin项目中,请将依赖项添加到gradle文件中

dependencies {
    implementation "org.jetbrains.anko:anko:$anko_version"
}

(如果只想使用它来创建对话框,只需添加anko-commons):

implementation "org.jetbrains.anko:anko-commons:$anko_version"

确保在项目级别的gradle文件中结算了$ anko_version:

ext.anko_version='0.10.8'

2-使用Anko创建警报/对话框

一个简单的例子:

alert { title = "Your Title goes here!"

        customView {
            val nameInput = editText() {hint = "Name?"}

            positiveButton("OK!") {
                if( checkUser(nameInput.text) ) {
                  sayHelloTo(nameInput.text)
                }
            }

            negativeButton("ABORT!") { /* do nothing */ }
        }

  }.show()

请阅读Anko Documentation - Dialogs,以了解如何使用Anko。