【问题标题】:Reference XML elements directly (in kotlin)直接引用 XML 元素(在 kotlin 中)
【发布时间】: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 bindingData 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


【解决方案1】:

您的旧项目似乎正在使用现在已弃用的Kotlin Synthetics,它允许您只需指定它们的 id 即可访问 XML 视图,但它现在已弃用并且不再由 Android Studio 自动添加到新项目中,这就是为什么您必须请改用findViewById,建议您使用migrate to ViewBinding

除此之外,您的代码中还有一些问题。

其中 name.text = 我的 activity_main 中的 EditText 元素 ID。

这是错误的,元素id是namename.text指的是EditText的text属性。

当你从 EditText 获取文本时

val text = findViewById<EditText>(R.id.name)

这为您提供了对EditText 的引用,如果您想将其text 属性的值设为String,则必须编写text.text.toString()text.toString()EditText 对象上调用 toString

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多