【问题标题】:Chat application's "Send" button not working聊天应用程序的“发送”按钮不起作用
【发布时间】:2017-03-04 14:57:34
【问题描述】:

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

我会直奔主题,我目前正在开发一个涉及使用 firebase 创建聊天室的应用程序,我发现了这个

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

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

这是我的聊天室代码:

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

【问题讨论】:

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


    【解决方案1】:

    欢迎叠加!! :)

    Update 只更新数据,如果数据库中没有要更新的数据则什么都不会发生。
    您的第一次更新将无济于事。

    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”进行数据库引用时。该数据库引用此时不存在。所以属性“name”和“msg”在数据库引用中不存在,因此无法更新。

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

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

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

    [编辑]

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

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

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

    { “规则”:{ “.read”:是的, “.write”:真 } }

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

    【讨论】:

    • 还是同样的问题:(
    • 已更新,我只按照您的建议将 updateChildren 更改为 setValue。
    • 一秒,我一会儿陪你:)
    • 当你按下按钮时你的数据库是否会更新。或者您的数据库上没有任何反映。我确信有些东西正在发布到您的数据库中。如果您的数据库上没有发布任何内容,请发表评论。
    • 抱歉回复晚了,我已经确认我已经添加了json文件并且之前已经将规则更改为'true'。出于某种原因,即使我没有碰任何东西,我也无法再运行我的应用程序。它给了我这个错误:错误:任务':app:transformClassesWithDexForDebug'的执行失败。 > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: 多个dex文件定义Lcom/google/android /gms/internal/zzafl;
    猜你喜欢
    • 2014-01-31
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2016-08-24
    相关资源
    最近更新 更多