我正在尝试从setOnclickListener内的onClick调用“ getVenueZipcode”。我希望将调用“ getVenueZipcode”,并在“ ZIPCODE =” +邮政编码之前打印“ zipcode [0] =“ + zipcode [0]”。但是,实际情况并非如此。先打印ZIPCODE = null,然后再进行邮政编码[0] = 12345已打印。
这是onClick Listener的工作方式还是我缺少什么?
mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gigEvent = new GigEvent();
mBand_name_editText = findViewById(R.id.add_band_name_editText);
mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
mDate_editText = findViewById(R.id.add_date_editText);
mTime_editText = findViewById(R.id.add_time_editText);
String venue_name = mVenue_name_editText.getText().toString();
String zipcode = getVenueZipcode(venue_name);
System.out.println("ZIPCODE = " + zipcode);
gigEvent.setGigAuth(userID);
gigEvent.setBand(mBand_name_editText.getText().toString());
gigEvent.setVenue(mVenue_name_editText.getText().toString());
gigEvent.setDate(mDate_editText.getText().toString());
gigEvent.setTime(mTime_editText.getText().toString());
gigEvent.setZipcode(zipcode);
mDatabase.child(userID).setValue(gigEvent);
Toast.makeText(AddGigEvent.this, "Gig/Event added!",
Toast.LENGTH_LONG).show();
startActivity(new Intent(AddGigEvent.this, Search.class));
}
});
}
public String getVenueZipcode(String name) {
final Query venue_query;
final String v_name = name;
final String[] zipcode = new String[1];
DatabaseReference mDatabase =
FirebaseDatabase.getInstance().getReference().child("venues");
venue_query = mDatabase.orderByChild("uid");
venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
if(snapshot.child("name").getValue().toString().equals(v_name)) {
zipcode[0] = snapshot.child("venue_zipcode").getValue().toString();
System.out.println("zipcode[0] = " + zipcode[0]);
return;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return zipcode[0];
}
答案 0 :(得分:0)
您将必须实现一个接口,一旦在FirebaseDatabase上获得邮政编码,该接口将为您提供回调。
您可以这样做:
interface ReceiveZipCodeListener {
public void onZipCodeReceived(String zipCode);
}
mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gigEvent = new GigEvent();
mBand_name_editText = findViewById(R.id.add_band_name_editText);
mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
mDate_editText = findViewById(R.id.add_date_editText);
mTime_editText = findViewById(R.id.add_time_editText);
String venue_name = mVenue_name_editText.getText().toString();
getVenueZipcode(venue_name, new ReceiveZipCodeListener({
@Override
public void onZipCodeReceived(String zipCode) {
System.out.println("ZIPCODE = " + zipcode);
gigEvent.setGigAuth(userID);
gigEvent.setBand(mBand_name_editText.getText().toString());
gigEvent.setVenue(mVenue_name_editText.getText().toString());
gigEvent.setDate(mDate_editText.getText().toString());
gigEvent.setTime(mTime_editText.getText().toString());
gigEvent.setZipcode(zipcode);
mDatabase.child(userID).setValue(gigEvent);
Toast.makeText(AddGigEvent.this, "Gig/Event added!",
Toast.LENGTH_LONG).show();
startActivity(new Intent(AddGigEvent.this, Search.class));
}
}));
}
});
public void getVenueZipcode(String name, ReceiveZipCodeListener listener) {
final Query venue_query;
final String v_name = name;
DatabaseReference mDatabase =
FirebaseDatabase.getInstance().getReference().child("venues");
venue_query = mDatabase.orderByChild("uid");
venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
if(snapshot.child("name").getValue().toString().equals(v_name)) {
String zipCode = snapshot.child("venue_zipcode").getValue().toString();
System.out.println("zipcode = " + zipCode);
listener.onZipCodeReceived(zipCode);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
答案 1 :(得分:0)
这是对我有用的解决方案:
FirebaseUser fBUser = mAuth.getCurrentUser();
final String userID = fBUser.getUid();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_gig_event);
actionBar = getSupportActionBar();
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FF0367BE")));
mAdd_gigEvent_btn = findViewById(R.id.add_gigEvent_btn);
mAdd_gigEvent_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
beenClicked();
}
});
}
public void beenClicked() {
mDatabase = FirebaseDatabase.getInstance().getReference().child("gigevents");
gigEvent = new GigEvent();
mBand_name_editText = findViewById(R.id.add_band_name_editText);
mVenue_name_editText = findViewById(R.id.add_venue_name_editText);
mDate_editText = findViewById(R.id.add_date_editText);
mTime_editText = findViewById(R.id.add_time_editText);
String venue_name = mVenue_name_editText.getText().toString();
getVenueZipcode(venue_name);
Toast.makeText(AddGigEvent.this, "Gig/Event added!",
Toast.LENGTH_LONG).show();
startActivity(new Intent(AddGigEvent.this, Search.class));
}
public void getVenueZipcode(String name) {
final Query venue_query;
final String v_name = name;
final String[] zipcode = new String[1];
final DatabaseReference mVenueDatabase =
FirebaseDatabase.getInstance().getReference().child("venues");
venue_query = mVenueDatabase.orderByChild("uid");
venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
if(snapshot.child("name").getValue().toString().equals(v_name)) {
zipcode[0] = snapshot.child("venue_zipcode").getValue().toString();
System.out.println("zipcode[0] = " + zipcode[0]);
gigEvent.setGigAuth(userID);
gigEvent.setBand(mBand_name_editText.getText().toString());
gigEvent.setVenue(mVenue_name_editText.getText().toString());
gigEvent.setDate(mDate_editText.getText().toString());
gigEvent.setTime(mTime_editText.getText().toString());
gigEvent.setZipcode(zipcode[0]);
mDatabase.child(userID).setValue(gigEvent);
return;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}