2015-11-29 16 views
6

Ho un pulsante di azione mobile (FAB) e un'attività asincrona che chiama FAB.hide() prima di caricare alcuni dati in background e FAB.show() una volta terminato. Per qualche ragione, anche se il mio log della console mostra chiaramente che viene sempre effettuata una chiamata a hide() e quindi a show(), a volte il FAB si nasconde ma non viene mostrato fino a quando l'attività non viene eseguita nuovamente.pulsante di azione mobile Android show() non funzionante

UPDATE

Il problema sembra accadere se le chiamate sono troppo vicini. Ho effettivamente provato il codice:

fab.hide(); 
fab.show(); 

e si verifica lo stesso problema (Fab non viene visualizzato). Qualche idea per gestirlo?

risposta

11

AGGIORNAMENTO: come noted on the Issue Tracker, questo problema è stato risolto dalla versione 24.2.0 della libreria di supporto.


Mi sono imbattuto in una situazione simile. Il problema sembra essere che il pulsante di azione fluttuante non si considera mostrato o nascosto fino a quando l'animazione Mostra/Nascondi non è terminata.

Quindi se si chiama hide(); ma si chiama show(); prima che l'animazione nasconda sia terminata, l'animazione dello spettacolo non verrà eseguita perché il pulsante è ancora impostato come già in uno stato visualizzato.

Non so se questa è la soluzione ottimale, ma ho risolto come segue:

boolean fabShouldBeShown; 
FloatingActionButton.OnVisibilityChangedListener fabListener = new FloatingActionButton.OnVisibilityChangedListener() { 
    @Override 
    public void onShown(FloatingActionButton fab) { 
     super.onShown(fab); 
     if(!fabShouldBeShown){ 
      fab.hide(); 
     } 
    } 

    @Override 
    public void onHidden(FloatingActionButton fab) { 
     super.onHidden(fab); 
     if(fabShouldBeShown){ 
      fab.show(); 
     } 
    } 
}; 

public void methodWhereFabIsHidden() { 
    fabShouldBeShown = false; 
    myFab.hide(fabListener); 
} 

public void methodWhereFabIsShown() { 
    fabShouldBeShown = true; 
    myFab.show(fabListener); 
} 

Impostando la nostra booleana insieme a questo ascoltatore possiamo affrontare queste situazioni interrotti. Quando arriviamo alla fine dell'animazione, controlliamo se siamo nello stato che in realtà vogliamo essere, e in caso contrario passiamo a quello corretto.

Problemi correlati