2017-03-04 96 views
1

这是我第一次问stackoverflow的问题。聊天应用程序的“发送”按钮不起作用

我就直接去点,我目前正在开发其涉及创建使用火力聊天室的应用程序,我发现这个

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。提前致谢。

回答

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

在这里你做出与推键子的参考。按键是独一无二的,不会有两个按键相同。所以当你将一个databaseReference创建到'message_root'时。该数据库引用在该点不存在。因此,数据库引用中不存在“name”和“msg”属性,因此无法更新。

这就是为什么你什么都看不到。要修复此问题,请尝试此操作

//message_root.updateChildren(map2); 

    message_root.setValue(map2); 

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

[编辑]

尝试确认至少有东西可以发布到你的数据库。 在你的创建方法中创建一个地图并将该地图推送到你的数据库。

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

转到Firebase控制台。转到数据库并单击规则。确保你的规则是这样的。

 

    { 
     "rules": { 

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

     } 
    } 

复制并放入这些规则并直接发布。 。

+0

还是同样的问题:( – Zephyros

+0

您可以发布您的代码,只需更新你的问题 –

+0

更新,我只是改变了updateChildren给setValue像你建议 – Zephyros