2017-03-04 18 views
1

これは私の初めての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"); 
     } 
    } 
} 

私はまだ両方で新人だとして本当に助けを感謝し、私は何か間違ったことをした場合、または提供された情報が十分ではなかった場合、私に教えてくださいアンドロイドスタジオとファイアベース。前もって感謝します。

答えて

0

ようこそ! :)

更新のみがデータを更新するため、データベースに更新するデータがない場合は何も起こりません。
最初のアップデートは何も行いません。

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

マップは空であり、マップは空であるため、何も更新されません。

2回目の更新は、また、何もしないだろうし、あなたがプッシュキーを持つ子への参照をした理由はここに

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

これがあります。プッシュキーは一意であり、2つのプッシュキーは同じではありません。だから、あなたが 'message_root'にdatabaseReferenceを作るとき。その時点でそのデータベース参照は存在しません。したがって、属性 "name"と "msg"はデータベース参照に存在しないため、更新することはできません。

これは何も表示されない理由です。これを修正するには、これを試してみてください

//message_root.updateChildren(map2); 

    message_root.setValue(map2); 

message_rootを更新する代わりに、代わりに値を設定します。値を設定する必要があります。これは、message_rootが存在しないためで、設定値を呼び出すことによって意味がある場合はその存在を設定します。

[EDIT]

は、少なくとも何かがあなたのデータベースに投稿することができたことを確認してください。 on createメソッドでは、マップを作成し、そのマップをデータベースにプッシュします。

何も反映されていない場合、私は2つの事のうちの1つが起こったと仮定することができます。 Firebaseを正しく設定していない(Googleサービスを追加したことがあります)、またはセキュリティルールが認証されたユーザーからの書き込みのみに設定されています。セキュリティルールが開いていることを確認してください。私はセキュリティルールが最も可能性の高い原因だと思う。

Firebaseコンソールに移動します。データベースに移動し、「ルール」をクリックします。ルールがこのようになっていることを確認してください。

 

    { 
     "rules": { 

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

     } 
    } 

これらのルールをコピーして、それらを直接ポスティングしてください。 。あなたが示唆したように

+0

それでも同じ問題:( – Zephyros

+0

あなたのコードを投稿することができますが、ちょうどあなたの質問を更新し –

+0

更新、私は唯一のsetValueするupdateChildrenを変更 – Zephyros

関連する問題