如何获取 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() 方法)!