2015-05-08 12 views
12

Sto usando Android Sliding Menu using Navigation Drawer. So che onWindowFocusChanged funziona su MainActivity. Come posso verificare se hasFocus su Fragment?come ottenere onWindowFocusChanged su Fragment?

qualcuno ha detto che posso passare lo hasFocus al frammento, ma non so come farlo. Qualcuno può darmi qualche codice di esempio?

Voglio correre ↓ questo sul mio frammento

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 

    if (hasFocus) { 
     //I need to do someing. 
     method(); 
    } 
} 

risposta

15

è possibile creare un'interfaccia e tutti i tuoi frammenti implementare questa interfaccia, e dentro il vostro onWindowFocusChanged si ottiene il frammento corrente e passare chiamare il metodo fornito da l'interfaccia.

Un'interfaccia di esempio per i frammenti potrebbe essere:

public interface IOnFocusListenable { 
    public void onWindowFocusChanged(boolean hasFocus); 
} 

I suoi frammenti devono implementare questa interfaccia:

public class MyFragment implements IOnFocusListenable { 
    .... 
    public void onWindowFocusChanged(boolean hasFocus) { 
     ... 
    } 
} 

E nel onWindowFocusChanged della vostra attività si può quindi fare quanto segue:

public class MyActivity extends AppCompatActivity { 
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     if(currentFragment instanceof IOnFocusListenable) { 
      ((IOnFocusListenable) currentFragment).onWindowFocusChanged(hasFocus); 
     } 
    } 
} 

Oppure si crea un listener e il listino attivo viene aggiunto al listener. Quindi, se il frammento è reso visibile, ti iscrivi a questo listener e ogni volta che viene chiamato l'evento onWindowFocusChanged chiami questo listener.

Questo approccio è molto simile al precedente con la differenza che c'è una lista di IOnFocusListenable 's e quelli si verificano in attività onWindowFocusChanged metodo

+0

Ottima risposta, molto utile e pulito! – arniotaki

-3

Questa è la soluzione migliore

view.post(new Runnable() { 
        @Override 
        public void run() { 
          // do your stuff here 
        } 
       } 
    ); 
+5

La migliore soluzione per cosa? Questo non ha nulla a che fare con il cambiamento del focus della finestra – Brian

9

Da API 18 è possibile utilizzare questo codice direttamente nella tua Frammento:

view.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() { 
    @Override 
    public void onWindowFocusChanged(final boolean hasFocus) { 
     // do your stuff here 
    } 
}); 

o più semplicemente con lambda:

view.getViewTreeObserver().addOnWindowFocusChangeListener(hasFocus -> { /*do your stuff here*/ }); 

Dove è possibile ottenere la visualizzazione in onViewCreated o semplicemente chiamare GetView() da ogni dove.