如何获取 Fragment 中的 onWindowFocusChanged?
how to get the onWindowFocusChanged on Fragment?
我正在使用 Android Sliding Menu using Navigation Drawer。
我知道 onWindowFocusChanged
在 MainActivity 上工作。
我如何检查它是否具有 Fragment 的焦点?
有人说我可以将 hasFocus
传递给片段,但我不知道该怎么做。谁能给我一些示例代码?
我要运行↓这个在我的片段上
@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) {
...
}
}
然后在 Activity 的 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
方法中触发的
从 Android 4.3 (API 18) 起,您可以在您的 Fragment 中直接使用此代码 ]:
科特林
view?.viewTreeObserver?.addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }
或在您的项目中定义此扩展:
fun Fragment.addOnWindowFocusChangeListener(callback: (hasFocus: Boolean) -> Unit) =
view?.viewTreeObserver?.addOnWindowFocusChangeListener(callback)
然后只需调用
addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }
片段中的任何地方(请注意 root view 当时仍然不为空)。
注意:完成后不要忘记删除监听器(removeOnWindowFocusChangeListener() 方法)!
Java
getView().getViewTreeObserver().addOnWindowFocusChangeListener(hasFocus -> { /*do your stuff here*/ });
或没有 lambda:
getView().getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override
public void onWindowFocusChanged(final boolean hasFocus) {
// do your stuff here
}
});
你可以在 onViewCreated() 方法中获取非空的 View 实例或者直接调用 getView () 之后的任何地方。
注意:完成后不要忘记删除监听器(removeOnWindowFocusChangeListener() 方法)!
我正在使用 Android Sliding Menu using Navigation Drawer。
我知道 onWindowFocusChanged
在 MainActivity 上工作。
我如何检查它是否具有 Fragment 的焦点?
有人说我可以将 hasFocus
传递给片段,但我不知道该怎么做。谁能给我一些示例代码?
我要运行↓这个在我的片段上
@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) {
...
}
}
然后在 Activity 的 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
方法中触发的
从 Android 4.3 (API 18) 起,您可以在您的 Fragment 中直接使用此代码 ]:
科特林
view?.viewTreeObserver?.addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }
或在您的项目中定义此扩展:
fun Fragment.addOnWindowFocusChangeListener(callback: (hasFocus: Boolean) -> Unit) =
view?.viewTreeObserver?.addOnWindowFocusChangeListener(callback)
然后只需调用
addOnWindowFocusChangeListener { hasFocus -> /*do your stuff here*/ }
片段中的任何地方(请注意 root view 当时仍然不为空)。
注意:完成后不要忘记删除监听器(removeOnWindowFocusChangeListener() 方法)!
Java
getView().getViewTreeObserver().addOnWindowFocusChangeListener(hasFocus -> { /*do your stuff here*/ });
或没有 lambda:
getView().getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override
public void onWindowFocusChanged(final boolean hasFocus) {
// do your stuff here
}
});
你可以在 onViewCreated() 方法中获取非空的 View 实例或者直接调用 getView () 之后的任何地方。