Android 不能正确地理解一个意图
我必须检查用户输入的代码与数据库代码是否有效。如果是,则应填充从firebase数据库到布局中所有字段的所有详细信息。否则,它应该返回主页,向未经授权的用户敬酒 问题是,即使用户输入的代码与数据库代码匹配,它也会将我带到Android 不能正确地理解一个意图,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我必须检查用户输入的代码与数据库代码是否有效。如果是,则应填充从firebase数据库到布局中所有字段的所有详细信息。否则,它应该返回主页,向未经授权的用户敬酒 问题是,即使用户输入的代码与数据库代码匹配,它也会将我带到主页。我怎样才能解决这个问题?谁能指引我 我的onCreate方法中的代码: inputCodesReference.addValueEventListener(new ValueEventListener() { @Override public void onData
主页
。我怎样才能解决这个问题?谁能指引我
我的onCreate
方法中的代码:
inputCodesReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
enteredUserCode = (String) ds.child("code").getValue();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
familyListReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
String key = (String) ds.getKey();
DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("familylist").child(key);
keyReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final String code = dataSnapshot.child("code").getValue(String.class);
String family = dataSnapshot.child("family").getValue(String.class);
String father = dataSnapshot.child("fatherName").getValue(String.class);
String mother = dataSnapshot.child("motherName").getValue(String.class);
for (DataSnapshot childSnapshot: dataSnapshot.child("children").getChildren()) {
String child = childSnapshot.getValue(String.class);
if (code.equals(enteredUserCode))
children.add(child);
}
if (code.equals(enteredUserCode)) {
Log.d(TAG, "[FINAL CHECK IN ACTIVITY] Database Code: " + code);
Log.d(TAG, "[FINAL CHECK IN ACTIVITY] User Input code: " + enteredUserCode);
familyName = family;
fatherName = father;
motherName = mother;
relativeLayout.setVisibility(View.VISIBLE);
welcomeMessage.setText("Welcome " + familyName + " family!");
fatherRadioButton.setText(fatherName);
motherRadioButton.setText(motherName);
} else {
Intent intent = new Intent(getApplicationContext(), HomePage.class);
startActivity(intent);
finish();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
}); // [Key Reference]
} // END of for Loop
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
}); // [familyList Database Reference]
//[CHECK IN]
checkinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fatherRadioButton.isChecked()) {
checkIn = new CheckIn(familyName, fatherName, null, checkInTime, childrenToDatabase);
} else {
checkIn = new CheckIn(familyName, null, motherName, checkInTime, childrenToDatabase);
}
checkInCheckOutDatabaseReference.push().setValue(checkIn);
Intent intent = new Intent(CheckInFinalActivity.this, HomePage.class);
startActivity(intent);
Toast.makeText(CheckInFinalActivity.this, "Check in Successful!", Toast.LENGTH_LONG).show();
}
}
});
每当从
firebase
检索DataSnapshot
时,就会执行onDataChange
方法中的enteredUserCode
行,因为该调用本质上是异步的
因此,enteredUserCode
此时可能无法用于familylistereference
。要确保enteredUserCode
可用,您需要将familyListReference的
侦听器移动到inputCodeReference
onDataChange
方法中
这是修改后的代码
inputCodesReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
enteredUserCode = (String) ds.child("code").getValue();
}
familyListReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
String key = (String) ds.getKey();
DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("familylist").child(key);
keyReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final String code = dataSnapshot.child("code").getValue(String.class);
String family = dataSnapshot.child("family").getValue(String.class);
String father = dataSnapshot.child("fatherName").getValue(String.class);
String mother = dataSnapshot.child("motherName").getValue(String.class);
for (DataSnapshot childSnapshot: dataSnapshot.child("children").getChildren()) {
String child = childSnapshot.getValue(String.class);
if (code.equals(enteredUserCode))
children.add(child);
}
if (code.equals(enteredUserCode)) {
Log.d(TAG, "[FINAL CHECK IN ACTIVITY] Database Code: " + code);
Log.d(TAG, "[FINAL CHECK IN ACTIVITY] User Input code: " + enteredUserCode);
familyName = family;
fatherName = father;
motherName = mother;
relativeLayout.setVisibility(View.VISIBLE);
welcomeMessage.setText("Welcome " + familyName + " family!");
fatherRadioButton.setText(fatherName);
motherRadioButton.setText(motherName);
} else {
Intent intent = new Intent(getApplicationContext(), HomePage.class);
startActivity(intent);
finish();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
}); // [Key Reference]
} // END of for Loop
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
}); // [familyList Database Reference]
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
//[CHECK IN]
checkinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fatherRadioButton.isChecked()) {
checkIn = new CheckIn(familyName, fatherName, null, checkInTime, childrenToDatabase);
} else {
checkIn = new CheckIn(familyName, null, motherName, checkInTime, childrenToDatabase);
}
checkInCheckOutDatabaseReference.push().setValue(checkIn);
Intent intent = new Intent(CheckInFinalActivity.this, HomePage.class);
startActivity(intent);
Toast.makeText(CheckInFinalActivity.this, "Check in Successful!", Toast.LENGTH_LONG).show();
}
}
});
这可确保输入的已准备就绪并可用于下一步操作
现在您有了一个方法,可以通过获得rootFirebaseInstance
而不是添加两个侦听器来进一步简化代码。这取决于你如何组织你的json
模式。你确定你没有在其他地方调用startActivity
?此Firebase侦听器是一个异步调用。添加更多代码将有助于诊断。检查用户的读写权限问题与读写无关。这是关于将用户带到正确的意图@sivaYes,我在checkIn按钮的onClick
方法中使用startActivity()
。我添加了onCreate方法代码。请检查以上更新的问题@Krishnakalubandik,如果我正确理解了流程,用户输入一个code
,然后单击checkInButton
。然后要验证代码
,然后根据代码
的正确性重定向到活动。我说的对吗?这对我不合适。当我添加这个时,循环继续,应用程序被挂起(我稍微修改了代码。你试过最新的代码吗?我可以通过github给你这个源代码吗?你能看一次吗?那太好了。一定要给我链接,你可以看这里!请参考这个