как получить onWindowFocusChanged на фрагменте?

Я использую Android раздвижное меню с помощью навигационного ящика. Я знаю это onWindowFocusChanged работа над MainActivity. Как я могу проверить, это hasFocus на фрагменте?

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

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

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

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

2 ответов


вы можете либо создать интерфейс, и все ваши фрагменты реализуют этот интерфейс, и внутри вашего 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 метод


С 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 адаптера() отовсюду.