如何在Fragment上获取onWindowFocusChanged?

Ben*_*Luk 20 android fragment

使用导航抽屉使用Android滑动菜单.我知道onWindowFocusChanged有关MainActivity的工作.我该怎么检查它是否有片段聚焦?

有人说我可以传递hasFocus给片段,但我不知道该怎么做.谁能给我一些示例代码?

我想在我的片段上运行↓这个

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

    if (hasFocus) {
        //I need to do someing.
        method();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*mas 25

API 18开始,您可以直接在Fragment中使用此代码:

科特林

view?.viewTreeObserver.addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }
Run Code Online (Sandbox Code Playgroud)

Java的

getView().getViewTreeObserver().addOnWindowFocusChangeListener(hasFocus -> { /*do your stuff here*/ });
Run Code Online (Sandbox Code Playgroud)

或没有lambda:

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

在哪里可以获取onViewCreated中视图对象或只是调用视图?/ getView()来自世界各地.


mik*_*enz 21

您可以创建一个接口,并且所有片段都实现此接口,并在您内部onWindowFocusChanged获取当前片段并通过调用接口提供的方法.

片段的示例界面可以是:

public interface IOnFocusListenable {
   public void onWindowFocusChanged(boolean hasFocus);
}
Run Code Online (Sandbox Code Playgroud)

您的片段必须实现此接口:

public class MyFragment implements IOnFocusListenable {
    ....
    public void onWindowFocusChanged(boolean hasFocus) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在onWindowFocusChanged您的活动中,您可以执行以下操作:

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

        if(currentFragment instanceof IOnFocusListenable) {
            ((IOnFocusListenable) currentFragment).onWindowFocusChanged(hasFocus);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您创建一个侦听器,并将活动片段添加到侦听器.因此,如果片段可见,则您订阅此侦听器,并且每次onWindowFocusChanged调用该事件时都会调用此侦听器.

这种方法与上面的方法非常相似,区别在于有一个列表IOnFocusListenable和那些在活动onWindowFocusChanged方法中触发的方法