2015-05-08 2 views
12

Я использую Android Sliding Menu using Navigation Drawer. Я знаю, что onWindowFocusChanged работает над MainActivity. Как я могу проверить это hasFocus на Fragment?Как получить onWindowFocusChanged на фрагменте?

Кто-то сказал, что я могу передать hasFocus фрагменту, но я не знаю, как это сделать. Может ли кто-нибудь дать мне пример кода?

Я хочу запустить ↓ это на мой фрагмент

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

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

ответ

15

Вы можете создать интерфейс и все фрагменты реализуют этот интерфейс, и внутри вашего onWindowFocusChanged вы получите текущий фрагмент и передать вызов метода предоставленный интерфейс.

интерфейс образца для фрагментов может быть:

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

Ваши фрагменты должны реализовать этот интерфейс:

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

И в onWindowFocusChanged вашей деятельности вы можете сделать следующее:

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

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

Или вы создаете слушателя, и активный фрагмент добавляется к слушателю. Поэтому, если фрагмент становится видимым, вы подписываетесь на этот прослушиватель, и каждый раз, когда вызывается событие onWindowFocusChanged, вы вызываете этот прослушиватель.

Этот подход очень похож на выше, с той разницей, что существует список IOnFocusListenable-х, и те, которые вызвали в деятельности onWindowFocusChanged методу

+0

Отличный ответ, очень полезно и аккуратно! – arniotaki

-3

Это лучшее решение

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

Лучшее решение для чего? Это не имеет ничего общего с изменением фокуса окна – Brian

9

С API 18 вы можете использовать этот код прямо в фрагменте:

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

или более просто с лямбда:

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

Где вы можете получить представление в onViewCreated или просто позвоните GetView() отовсюду.

Смежные вопросы