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()方法)!回答得很好,很有帮助,很整洁!