如何动态地将键和值添加到 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
的初始内容。即使用户在其中键入内容,keyjson
和 valuejson
也永远不会改变。
您需要在存储它们之前读取这些值,因此您正在获取当前数据:
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()
}
我遇到了一个奇怪的错误,我无法弄清楚为什么会发生这种情况,因为我有一个 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
的初始内容。即使用户在其中键入内容,keyjson
和 valuejson
也永远不会改变。
您需要在存储它们之前读取这些值,因此您正在获取当前数据:
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()
}