我认为datasnapshot值返回null,因为当我运行它时,textview是空的,即使数据库firebase中有一个名称

piwo6bdm  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(349)

下面的代码是针对一个tictactoe游戏的,但是我的问题是,我想在这个活动中显示玩家的名字,而他们名字的输入来自另一个活动,该活动的代码在playernames.java中。
games.java代码:

package com.example.tictactoe2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.Objects;

public class Game extends AppCompatActivity {

FirebaseDatabase database = FirebaseDatabase.getInstance("https://playernames-default-rtdb.firebaseio.com/");
DatabaseReference dbRef = database.getReference();

Button [] buttons = new Button[9];

int p1Score, p2Score, playerStatus;
int p1ScoreCount, p2ScoreCount, rountCount;
boolean activePlayer;
int [] gameState = {2,2,2,2,2,2,2,2,2};

int [][] winPositions = {
        {0,1,2}, {3,4,5}, {6,7,8},
        {0,3,6}, {1,4,7}, {2,5,8},
        {0,4,8}, {2,4,6}
};

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

    TextView p1n = findViewById(R.id.p1);
    TextView p2n = findViewById(R.id.p2);

    Query pp = dbRef.child("Players");

    pp.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot nsnap: dataSnapshot.getChildren()) {
                    String p1 = (String) nsnap.child("1").getValue();
                    String p2 = (String) nsnap.child("2").getValue();

                    p1n.setText(p1);
                    p2n.setText(p2);
                }
            Toast.makeText(Game.this, "it worked", Toast.LENGTH_SHORT).show();

            }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(Game.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    XoGame();

}

下面的代码用于用户在edittext中输入姓名的活动,如下所示,第一个播放器是p1name,第二个是p2name。它们的名称通过设置值存储在数据库中。这些名字被正确地存储在数据库中,我查过了。问题是当从game.java中的数据库检索到它时。
playernames.java代码:

package com.example.tictactoe2;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.ArrayList;

public class PlayerNames extends AppCompatActivity {

FirebaseDatabase database = FirebaseDatabase.getInstance("https://playernames-default-rtdb.firebaseio.com/");
DatabaseReference dbRef = database.getReference();

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

    EditText p1Name = findViewById(R.id.player1);
    EditText p2Name = findViewById(R.id.player2);

    Button cont = findViewById(R.id.contbtn);

    cont.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String n1 = p1Name.getText().toString();
            String n2 = p2Name.getText().toString();

            dbRef.child("Players").push();
            dbRef.child("Players").child("1").setValue(n1);
            dbRef.child("Players").child("2").setValue(n2);

            Intent i = new Intent(PlayerNames.this, Game.class);
            startActivity(i);
        }
    });

}
}

我认为问题出在datasnapshot的for循环中,或者我将快照转换为字符串的地方。它没有显示玩家的名字,即使它在我查过的firebase的数据库里。它显示为空。
firebase实时数据库:数据库
从用户输入玩家姓名的活动
textview它应该输出到哪里
按continue后输出为空

ocebsuys

ocebsuys1#

您需要在推送值时获取键,因为它将被视为树中的节点,然后设置 String 价值观

String key = dbRef.child("Players").push().getKey();
dbRef.child("Players").child(key).child("1").setValue(n1);
dbRef.child("Players").child(key).child("2").setValue(n2);

并用以下方法检索它们:

Query pp = dbRef.child("Players").child(key);
pp.addValueEventListener(new ValueEventListener() {
...
olhwl3o2

olhwl3o22#

在您的外部添加以下代码 oncreate method .

public interface myCallback{
    void onCallback(String p1,String p2);
}

public void getData(final myCallback myCallback){
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Players");
    reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            String p1 = (String) snapshot.child("1").getValue();
            String p2 = (String) snapshot.child("2").getValue();
            myCallback.onCallback(p1,p2);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

然后在里面添加下面的代码 oncreate method 之后 TextView p2n = findViewById(R.id.p2); ```
getData(new myCallback() {
@Override
public void onCallback(String p1, String p2) {
p1n.setText(p1);
p2n.setText(p2);
XoGame();
}
});

并移除 `TextView p2n = findViewById(R.id.p2);` 至 `}` . 希望这能奏效。

相关问题