setUserVisibleHint()
wird manchmal vorher onCreateView()
und manchmal danach angerufen, was zu Problemen führt.
Um dies zu überwinden, müssen Sie isResumed()
auch die setUserVisibleHint()
Methode überprüfen . Aber in diesem Fall wurde mir klar setUserVisibleHint()
, dass er nur aufgerufen wird , wenn das Fragment wieder aufgenommen und sichtbar ist, NICHT wenn es erstellt wurde.
Wenn Sie also etwas aktualisieren möchten, während Fragment ist visible
, setzen Sie Ihre Aktualisierungsfunktion sowohl in onCreate()
als auch in setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
UPDATE: Trotzdem myUIUpdate()
wurde mir klar , dass manchmal zweimal aufgerufen wird. Der Grund ist, wenn Sie 3 Registerkarten haben und dieser Code sich auf der zweiten Registerkarte befindet. Wenn Sie die erste Registerkarte zum ersten Mal öffnen, wird auch die zweite Registerkarte erstellt, auch wenn sie nicht sichtbar ist und myUIUpdate()
aufgerufen wird. Wenn Sie dann zur zweiten Registerkarte wischen, wird myUIUpdate()
from if (visible && isResumed())
aufgerufen und wird daher myUIUpdate()
möglicherweise zweimal in einer Sekunde aufgerufen.
Das andere Problem besteht !visible
darin setUserVisibleHint
, sowohl 1) beim Verlassen des Fragmentbildschirms als auch 2) vor dem Erstellen aufgerufen zu werden, wenn Sie zum ersten Mal zum Fragmentbildschirm wechseln.
Lösung:
private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...
@Override
public View onCreateView(...){
...
//Initialize variables
if (!fragmentResume && fragmentVisible){ //only when first time fragment is created
myUIUpdate();
}
...
}
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){ // only at fragment screen is resumed
fragmentResume=true;
fragmentVisible=false;
fragmentOnCreated=true;
myUIUpdate();
}else if (visible){ // only at fragment onCreated
fragmentResume=false;
fragmentVisible=true;
fragmentOnCreated=true;
}
else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
fragmentVisible=false;
fragmentResume=false;
}
}
Erläuterung:
fragmentResume
, fragmentVisible
: Stellt sicher , dass myUIUpdate()
in onCreateView()
nur aufgerufen wird, wenn ein Fragment erstellt und sichtbar ist, nicht beim Fortsetzen. Es löst auch das Problem, wenn Sie sich auf der ersten Registerkarte befinden. Die zweite Registerkarte wird erstellt, auch wenn sie nicht sichtbar ist. Dies löst das und prüft, ob der Fragmentbildschirm wann sichtbar ist onCreate
.
fragmentOnCreated
: Stellt sicher, dass das Fragment nicht sichtbar ist und beim ersten Erstellen des Fragments nicht aufgerufen wird. Diese if-Klausel wird jetzt nur aufgerufen, wenn Sie aus dem Fragment wischen.
Aktualisieren
Sie setzen können alle diesen Code in BaseFragment
Code wie folgt aus und überschreiben Methode.