android - 如何获取片段内在firebase中注册的用户数?
问题描述
我使用以下方法检索我的 firebase 数据库中的用户帐户数。当我使用活动时,它工作正常。但是当我在片段中使用相同的方法时,应用程序会崩溃。要做哪些修改?
private void loadDetails() {
DatabaseReference ref= FirebaseDatabase.getInstance().getReference("Users");
ref.orderByChild("accountType").equalTo("User").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
userList.clear();
for(DataSnapshot ds: snapshot.getChildren()){
ModelUsers modelUsers=ds.getValue(ModelUsers.class);
userList.add(modelUsers);
}
cusValueTv.setText(userList.size());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
Logcat如下,
2020-08-01 16:28:34.048 3697-3697/com.myproject.marutiVendor E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myproject.marutiVendor, PID: 3697
android.content.res.Resources$NotFoundException: String resource ID #0x19
at android.content.res.Resources.getText(Resources.java:360)
at android.content.res.MiuiResources.getText(MiuiResources.java:97)
at android.widget.TextView.setText(TextView.java:5873)
at com.myproject.marutiVendor.DashboardFragment$2.onDataChange(DashboardFragment.java:92)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
解决方案
您正在为这一行中的文本视图设置一个数值:
cusValueTv.setText(userList.size());
Android 将此调用映射到此方法签名:
setText(int resid)
使用字符串资源标识符设置要显示的文本。
因此,它会寻找具有该数字 ID 的资源。这很有帮助的原因是,您可以在资源包中为不同语言提供文本的翻译。
当然,这些都不适用于您的场景,因为您实际上只是想显示数字本身,而不是资源。要调用 的正确版本setText
,您只需在调用中将数字转换为字符串:
cusValueTv.setText(userList.size().toString());
或者:
cusValueTv.setText("" + userList.size());
推荐阅读
- javascript - 客户端浏览器关闭时如何从网站发送通知?
- ruby-on-rails - 如何在仅 API 的 Rails 中保存嵌套的多对多关系?
- azure-devops - 有什么方法可以在 Azure Build Pipeline 运行期间缓存签名的二进制文件并拉取它们?
- node.js - 多个 devServer 代理和多个端口
- graphql - gatsby中的allFile和allMarkdownRemark有什么区别
- python - 我正在尝试使用 python 用 django 绘制图形,但会跳转 IndentationError: expected an indented block
- php - 如何获取需要以 PHP 形式换行的文本列表?
- java - 增长顺序 - 负载因子对哈希表的影响
- ansible - Ansible - 查找具有特定路径的文件并将其从字典中复制到特定的预设目标
- image - 使用精确的规格将 JPG 转换为 BMP