gpt4 book ai didi

java - 聊天应用程序的 "Send"按钮不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:15 24 4
gpt4 key购买 nike

这是我第一次在 stackoverflow 上提问。

我就开门见山,我目前正在开发一个应用程序,其中涉及使用 firebase 创建聊天室,我发现了这个

https://www.youtube.com/watch?v=uX6_w6yhj4E

并决定跟随他。一切都很顺利,直到我完成代码并尝试运行它。除了应该在聊天室中显示我的消息的发送按钮之外,一切都按预期运行。即使我点击了我的发送按钮也没有响应。我似乎找不到问题所在。

这是我的 chat_room 代码:​​

public class Chat_Room extends AppCompatActivity {

private Button btn_send_msg;
private EditText input_msg;
private TextView chat_conversation;

private String user_name, room_name;
private DatabaseReference root;
private String temp_key;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_room);

btn_send_msg = (Button) findViewById(R.id.btn_send);
input_msg = (EditText) findViewById(R.id.msg_input);
chat_conversation = (TextView) findViewById(R.id.textview);

user_name = getIntent().getExtras().get("user_name").toString();
room_name = getIntent().getExtras().get("room_name").toString();
setTitle(" Room - "+room_name);

root = FirebaseDatabase.getInstance().getReference().child(room_name);

btn_send_msg.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {

Map<String,Object> map = new HashMap<String, Object>();
temp_key = root.push().getKey();
root.updateChildren(map);

DatabaseReference message_root = root.child(temp_key);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name",user_name);
map2.put("msg",input_msg.getText().toString());

//message_root.updateChildren(map2);
message_root.setValue(map2);

}
});

root.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {

append_chat_conversation(dataSnapshot);
}

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {

append_chat_conversation(dataSnapshot);
}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {

}

@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

}

private String chat_msg, chat_user_name;

private void append_chat_conversation(DataSnapshot dataSnapshot){

Iterator i = dataSnapshot.getChildren().iterator();

while (i.hasNext()){
chat_msg = (String) ((DataSnapshot)i.next()).getValue();
chat_user_name = (String) ((DataSnapshot)i.next()).getValue();

chat_conversation.append(chat_user_name +" : "+chat_msg+"\n");
}
}
}

如果我做错了什么或者提供的信息不够,请告诉我,非常感谢您的帮助,因为我仍然是 android studio 和 firebase 的菜鸟。提前致谢。

最佳答案

欢迎来堆!! :)

更新仅更新数据,如果数据库中没有要更新的数据则不会发生任何事情。
您的第一次更新不会执行任何操作。

Map<String,Object> map = new HashMap<String, Object>();
temp_key = root.push().getKey();
root.updateChildren(map);

map 是空的,不会更新任何内容,因为 map 是空的。

第二次更新,也不会执行任何操作,这就是原因

 DatabaseReference message_root = root.child(temp_key);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name",user_name);
map2.put("msg",input_msg.getText().toString());

message_root.updateChildren(map2);

在这里,您使用按钮引用了子项。按键是唯一的,没有两个按键是相同的。所以当你建立数据库时要引用'message_root'。该数据库引用此时不存在。因此,数据库引用中不存在属性“name”和“msg”,因此无法更新。

这就是为什么你什么也看不见的原因。要修复它,请尝试此操作

    //message_root.updateChildren(map2);

message_root.setValue(map2);

而不是更新 message_root。而是设置该值。您必须设置该值,因为 message_root 不存在,并且通过调用设置值您可以设置其存在(如果有意义)。

[编辑]

尝试确认至少有一些内容可以发布到您的数据库中。在您的 on create 方法中创建一个 map 并将该 map 推送到您的数据库。

如果没有任何反射(reflect),我只能假设发生了两件事之一。您的 Firebase 设置不正确(是否添加了 google-services json),或者您的安全规则设置为仅来自经过身份验证的用户的大量写入。请确保您的安全规则已打开。我认为安全规则是最有可能的原因。

转到 Firebase 控制台。转到数据库并单击“规则”。确保您的规则如下所示。

    {      "rules": {        ".read": true,        ".write": true      }     }

复制并粘贴这些规则并直接发布。

关于java - 聊天应用程序的 "Send"按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com