Вы инициализируете экземпляр url где-нибудь еще, кроме этого:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
}
Если нет, то каково значение url при вызове функции setPhoto (url)?Это будет то, с чем вы инициализировали URL в этом упражнении.Если вы инициализировали с нулем, оно будет нулевым.Почему бы вам не переместить setPhoto (url) внутри метода onDataChange (..) сразу после оператора
url = dataSnapshot.getValue(String.class);
Таким образом, вы можете быть уверены, что url имеет значение.Причиной инициализации URL при нажатии кнопки, скорее всего, является то, что ValueEventListener вызывается с вызываемым методом onDataChange (...).Вот почему вы получаете значение url правильно при нажатии кнопки.Надеюсь, это прояснит ситуацию.