Android Kotlin 如何用AutoCompleteTextView输入作为Firestore文档ID查询
问题原因
- 变量作用域问题:
enteredText是按钮点击回调内的局部变量,仅在点击事件触发时才会赋值,外部的Firestore查询代码无法访问该变量 - 硬编码字符串问题:你写的
.document("enteredText")是把固定字符串enteredText作为文档ID传入,而非传入enteredText变量存储的用户输入内容 - 执行时机错误:Firestore查询代码当前写在
onCreate方法中,页面启动时就会执行,此时用户还未完成输入,自然无法拿到有效文档ID - 代码语法问题:重复定义
docRef变量,且导入了未使用的com.google.firebase.firestore.FieldPath.documentId,会引发编译异常
解决方案
把Firestore查询逻辑整体迁移到按钮的点击回调中,用户点击按钮时先读取输入框内容,再用该内容作为文档ID发起Firestore查询即可。
修正后完整代码
package com.example.servus import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.TextView import com.google.firebase.firestore.ktx.firestore import com.google.firebase.ktx.Firebase import android.view.View import android.widget.ArrayAdapter import android.widget.AutoCompleteTextView import android.widget.Button import android.widget.Toast class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化控件 val autotextView = findViewById<AutoCompleteTextView>(R.id.autoTextViewStart) val autotextViewZiel = findViewById<AutoCompleteTextView>(R.id.autoTextViewZiel) val value1 = findViewById(R.id.value1) as TextView val value2 = findViewById(R.id.value2) as TextView val value3 = findViewById(R.id.value3) as TextView val button = findViewById<Button>(R.id.btn) val db = Firebase.firestore // 配置自动补全适配器 val languages = resources.getStringArray(R.array.Languages) val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, languages) autotextView.setAdapter(adapter) autotextViewZiel.setAdapter(adapter) // 按钮点击逻辑 button?.setOnClickListener { // 获取输入内容,转成字符串 val enteredText = autotextView.text.toString() Toast.makeText(this@MainActivity, enteredText, Toast.LENGTH_SHORT).show() // 输入为空时直接返回,避免无效查询 if (enteredText.isBlank()) return@setOnClickListener // 用用户输入的内容作为文档ID发起查询 val docRef = db.collection("strecken").document(enteredText) docRef.get() .addOnSuccessListener { document -> if (document != null && document.exists()) { Log.d("exist", "DocumentSnapshot data: ${document.data}") value1.text = document.getString("value1") value2.text = document.getString("value2") value3.text = document.getString("value3") } else { Log.d("noexist", "无对应文档") Toast.makeText(this@MainActivity, "未找到对应文档", Toast.LENGTH_SHORT).show() } } .addOnFailureListener { exception -> Log.w("notexisting", "获取文档出错", exception) Toast.makeText(this@MainActivity, "查询失败:${exception.message}", Toast.LENGTH_SHORT).show() } } } }
如果需要把两个输入框的内容拼接作为文档ID,仅需要把enteredText的赋值逻辑改成val enteredText = autotextView.text.toString() + autotextViewZiel.text.toString(),按需调整拼接规则即可。
内容的提问来源于stack exchange,提问作者CSBossmann
相关产品推荐
相关产品推荐

