如何动态地将键和值添加到 kotlin 中的可变映射

How to Daynamically add Keys and Values to a mutable map in kotlin

我遇到了一个奇怪的错误,我无法弄清楚为什么会发生这种情况,因为我有一个 mutableMapOf 并且我想在每次添加新项目时都动态地向其添加键和值。发生的情况是,无论输入多少数据,它都只存储最后的项目,如果我对数据进行硬编码,它会正常存储它,但在该方法的范围内它不起作用,我无法弄清楚为什么?

private fun showDialogBody() {
    val dialog = Dialog(this)
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog.setCancelable(true)
    dialog.setContentView(R.layout.dialogue_view)
    val bodyKey = dialog.findViewById(R.id.key) as EditText
    val bodyvalue = dialog.findViewById(R.id.value) as EditText
    val addBtn = dialog.findViewById(R.id.dialogDismiss_button) as Button
    val finishBtn = dialog.findViewById(R.id.dialogDismiss_finish_button) as Button

    keyjson = bodyKey.text.toString().trim()
    valuejson = bodyvalue.text.toString().trim()

    jsonMap = mutableMapOf(keyjson to valuejson)

    addBtn.setOnClickListener {

        jsonMap.put(keyjson, valuejson)


        Toast.makeText(this, "${bodyKey.text} Added", Toast.LENGTH_SHORT).show()
        bodyKey.text.clear()
        bodyvalue.text.clear()
    }
    finishBtn.setOnClickListener {
        dialog.dismiss()
        Toast.makeText(this, " number of key value ${jsonMap.size}", Toast.LENGTH_SHORT).show()

    }
    dialog.show()

}

这是因为您在初始化对话框时这样做:

keyjson = bodyKey.text.toString().trim()
valuejson = bodyvalue.text.toString().trim()

您将设置这些值一次,就在对话框的布局被扩充之后。所以这些值只是那些 EditText 的初始内容。即使用户在其中键入内容,keyjsonvaluejson 也永远不会改变。

您需要在存储它们之前读取这些值,因此您正在获取当前数据:

addBtn.setOnClickListener {
    val keyjson = bodyKey.text.toString().trim()
    val valuejson = bodyvalue.text.toString().trim()
    jsonMap.put(keyjson, valuejson)

    Toast.makeText(this, "${bodyKey.text} Added", Toast.LENGTH_SHORT).show()
    bodyKey.text.clear()
    bodyvalue.text.clear()
}