Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

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

Ответ 2

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

Котлин

view?.viewTreeObserver.addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }

Java

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

или без лямбды:

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

Где можно получить непустой объект View в методе onViewCreated или просто вызвать представление?/getView() отовсюду.

Ответ 3

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

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