Firebase Realtime Database数据未在TextView中显示的问题求助
问题核心原因定位
你的代码存在三处会导致数据无法正常展示的明确问题,按影响优先级排序如下:
- 冗余无效的循环遍历逻辑
你初始化的DatabaseReference已经直接指向state节点,onDataChange回调里拿到的dataSnapshot本身就对应整个state的快照,根本不需要额外套for (DataSnapshot snapshot : dataSnapshot.getChildren())循环。更关键的是,循环内部你仍然从外层的dataSnapshot取值,没有使用循环生成的snapshot变量,这层循环不仅没有实际作用,还会导致取值代码被重复执行2次(遍历两个子节点各跑一遍赋值逻辑),增加不必要的性能开销。 - TextView setText 方法API误用(核心崩溃原因)
Android的TextView有两个重载的setText方法:一个接收字符串类型参数,另一个接收int类型参数——后者的参数是要求传入res/values目录下的字符串资源ID,而非业务数据的整数值。你直接把从数据库拿到的weight整型值(比如2500)传给setText,系统会尝试查找对应ID的资源,由于根本不存在该ID的资源,会直接抛出Resources$NotFoundException异常,导致页面赋值逻辑中断,两个TextView都无法正常显示内容。 - 错误回调未做日志打印,问题排查无感知
你的onCancelled方法完全为空,当遇到Firebase数据库权限不足、网络同步失败等问题时,没有任何日志输出,会导致问题出现时完全定位不到根因。
修正后的可正常运行的代码
public class SubActivity extends AppCompatActivity { TextView tvWeight; TextView tvOpen_close; private static final String TAG = "SubActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); tvWeight = findViewById(R.id.textView_weight); tvOpen_close = findViewById(R.id.textView_open_close); final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("state"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 直接从state节点快照取值,删除冗余循环 String openState = dataSnapshot.child("open_close").getValue(String.class); Integer weight = dataSnapshot.child("weight").getValue(Integer.class); // 空值判断避免空指针,转成字符串后赋值 tvOpen_close.setText(openState == null ? "状态未知" : openState); tvWeight.setText(weight == null ? "--" : String.valueOf(weight)); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 打印错误日志,方便排查权限、网络等问题 Log.e(TAG, "Firebase数据读取失败: " + databaseError.getMessage()); } }); } }
后续排查注意点
- 确认Firebase Realtime Database的规则没有限制读取权限,对应访问身份要有目标节点的读权限
- 确认项目的
google-services.json配置正确,数据库的实例地址和配置文件里的地址完全匹配
内容的提问来源于stack exchange,提问作者ksmoany
相关产品推荐
相关产品推荐

