如何在Fragment中获取onWindowFocusChanged事件?

30

我正在使用Android侧滑菜单(使用导航抽屉)

我知道onWindowFocusChanged在MainActivity上工作。

如何检查Fragment是否具有hasFocus

有人说我可以将hasFocus传递给片段,但我不知道如何做到这一点。 有人可以给我一些示例代码吗?

我想在我的片段上运行↓

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

    if (hasFocus) {
        //I need to do someing.
        method();
    }
}
2个回答

51

Android 4.3(API 18) 开始,您可以在 Fragment 中直接使用以下 Kotlin 代码:

Kotlin

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*/ }

在片段中的任何位置都可以添加监听器(只需小心,在此期间根视图仍不为空)。

注意:完成后请勿忘记删除侦听器(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() 方法)!


23

你可以创建一个接口,让所有的 fragment 实现这个接口,在你的 onWindowFocusChanged 中获取当前的 fragment 并调用接口提供的方法。

fragments 的示例接口可以是:

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方法中被触发。

非常好的答案,非常有帮助而且整洁! - arniotaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接