聊天应用"发送"按钮不起作用

时间:2017-03-04 14:57:34

标签: java android android-studio firebase-realtime-database chatroom

这是我第一次在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的新手。提前谢谢。

1 个答案:

答案 0 :(得分:0)

欢迎来到!! :)

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

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);

在这里,您使用推键引用了孩子。按键是唯一的,没有两个按键是相同的。因此,当您将数据库引用发送到&#39; message_root&#39;时。那时数据库引用不存在。所以属性,&#34; name&#34;和&#34; msg&#34;不存在于数据库引用中,因此无法更新。

这就是你什么也看不见的原因。要修复它,试试这个

    //message_root.updateChildren(map2);

    message_root.setValue(map2);

而不是更新message_root。改为设置值。您必须设置该值,因为message_root不存在,并且通过调用设置值,如果有意义,则设置它的存在。

[编辑]

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

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

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


    {
      "rules": {

        ".read": true,
        ".write": true

      } 
    }

复制并修改这些规则并直接发布。