Android 如何在片段上获得onWindowFocusChanged?

Android 如何在片段上获得onWindowFocusChanged?,android,fragment,Android,Fragment,我正在使用。 我知道onWindowFocusChanged在MainActivity上工作。 我如何检查它是否集中在片段上 有人说我可以将hasFocus传递给fragment,但我不知道怎么做。谁能给我一些示例代码 我想跑步↓ 这是我的碎片 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) {

我正在使用。 我知道
onWindowFocusChanged
在MainActivity上工作。 我如何检查它是否集中在片段上

有人说我可以将
hasFocus
传递给fragment,但我不知道怎么做。谁能给我一些示例代码

我想跑步↓ 这是我的碎片

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

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

您可以创建一个接口,并且所有片段都实现该接口,在
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
列表,这些列表在Android 4.3(API 18)的活动
onWindowFocusChanged
方法中触发,并且您可以在片段中直接使用此代码

科特林
view?.viewTreeObserver?.addOnWindowFocusChangeListener{hasFocus->/*在这里做你的事*/}
或在项目中定义此扩展:

fun Fragment.addOnWindowFocusChangeListener(回调:(hasFocus:Boolean)->Unit)=
view?.viewTreeObserver?.addOnWindowFocusChangeListener(回调)
然后简单地打电话

addOnWindowFocusChangeListener{hasFocus->/*在这里做你的事*/}
片段中的任何位置(请注意,根视图那时仍然不是空的)

注意:完成后不要忘记删除侦听器(removeOnWindowFocusChangeListener()方法)!
JAVA
getView().getViewTreeObserver().addOnWindowFocusChangeListener(hasFocus->{/*在这里做事*/});
或没有lambda:

getView().getViewTreeObserver().addOnWindowFocusChangeListener(新的ViewTreeObserver.OnWindowFocusChangeListener()){
@凌驾
WindowFocusChanged上的公共无效(最终布尔值hasFocus){
//在这里做你的事
}
});
在这里,您可以在onViewCreated()方法中获取非空的视图实例,或者在之后的任何位置调用getView()


注意:完成后不要忘记删除侦听器(removeOnWindowFocusChangeListener()方法)!回答得很好,很有帮助,很整洁!