You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:30:04