【发布时间】:2021-10-17 04:05:25
【问题描述】:
我正在查看一个旧项目,并注意到我无法重新创建以下内容:
var name = name.text.toString()
其中 name.text = 我的 activity_main 中的 EditText 元素 ID。
我知道这曾经有效。
我之所以问,是因为在我的 RealTime Firebase 中,我想根据文本值查询不同子项的条目:
例如:ref.child("Main").child(edit-text-string data).setValue(some other edit-text-string data)
我现在看到我需要通过 id 来查找元素,
我尝试通过 id 查找edittext,将其分配给一个变量,然后将 value.toString() 传递给 child() 但以下代码引发以下错误
val text = findViewById<EditText>(R.id.name)
val value = text.toString()
ref.child("main").child(value.toString()).setValue("testdata")
this throws an error com.google.firebase.database.DatabaseException: Invalid Firebase Database path: androidx.appcompat.widget.AppCompatEditText{3b54811 VFED..CL. .F...... 0,0-1440,85 #7f0801d9 app:id/name aid=1073741824}. Firebase Database paths must not contain '.', '#', '$', '[', or ']'
因为它仍然将值解释为对象(?)
你能想出一种方法来使用来自用户的文本创建子“标题”吗?
【问题讨论】:
-
如果您指的是 Kotlin Synthetics,它们已被弃用并从默认设置中删除。当前的建议是使用View binding 或Data binding。如果您不想使用其中任何一个,
findViewById()仍然可用(无论如何,这些都是在幕后所做的)。 -
嗯数字,谢谢迈克。你能想出一种方法来实现我的目标吗?
-
val value = text.toString()- 直接在EditText上调用toString()。您想在EditText的文本中调用它:val value = text.text.toString()。您选择text作为变量名的事实可能会引起一些混乱。 -
啊,好吧,我明白你的意思了,谢谢
-
视图绑定可能是您已有的最简单的插件 - 它只是像
name这样的所有视图变量最终都在LayoutNameBinding对象上声明,而不是在活动/片段上。通常,您会获得对该对象的引用(通常称为binding)并转到binding.name.text.toString(),或者您可以使用 Kotlin 的作用域函数,如with(binding)或binding.apply来避免重复binding,这样您就可以包装您的代码原样
标签: xml android-studio kotlin firebase-realtime-database android-edittext