нет способа сделать это в css2. вы можете добавить класс в li и ссылаться на a
li.active > a {
property: value;
}
Это потому, что Firebase все еще не извлекал данные в то время, когда вы делаете:
Log.d(TAG, mName);
mName
в настоящее время является нулевым, поскольку эта строка была выполнена до того, как Firebase получила данные.
Чтобы решить эту проблему, вы должны Log.d(TAG, mName)
использовать метод onDataChange
. В противном случае это будет null
, поскольку вы еще не установили значение (поскольку Firebase все еще не получил значение).
Как говорили другие: все данные из базы данных Firebase считываются асинхронно. Легче всего это увидеть, добавив еще несколько операторов журнала в ваш код:
Log.d(TAG, "Before attaching listener");
mDatabase.child("Admin")
.child("Info")
.child(uid)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "In listener's onDataChange");
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "getUser:onCancelled", databaseError.toException());
}
});
Log.d(TAG, "After attaching listener");
В отличие от того, что вы можете ожидать, вывод этого:
Перед подключением слушателя
После подключения слушателя
Внутри прослушивателя onDataChange
blockquote>. Способ борьбы с асинхронным поведением состоит в том, чтобы пересмотреть вашу проблему.
В настоящий момент ваш код написан: сначала мы загружаем данные, затем записываем его.
Если вы переделаете проблему на: «всякий раз, когда данные загружаются, мы заносим их в журнал» , вы получите код следующим образом:
mDatabase.child("Admin") .child("Info") .child(uid) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { UserDetails info = dataSnapshot.getValue(UserDetails.class); Log.d(TAG, String.valueOf(dataSnapshot)); mName = info.getName(); Log.d(TAG, mName); } @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "getUser:onCancelled", databaseError.toException()); } });
Таким образом, весь код, который нуждается в данных, должен находиться внутри
onDataChange()
. Кроме того, вы можете создать свой собственный метод обратного вызова и вызвать его изonDataChange()
. Но логика всегда одна и та же: код, который нуждается в данных, запускается изonDataChange()
, когда данные доступны .