Android Fragments 如何仅在用户可见时运行片段中代码

t1rydlwq  于 2022-11-24  发布在  Android
关注(0)|答案(2)|浏览(117)

我有4个片段,我的问题是,当我滑动到第二个片段并摇动我的手机时,它会运行第一个片段的代码,因为它是同一个活动的一部分。我覆盖了onResume和onPause方法,但它不会正常工作(只有当我滑动到第三个片段时才工作,而传感器未注册)。我已经尝试过在onSensorChanged方法中使用if函数,并放置一些公共静态int fragmentPageNumber,然后将其更改为每个片段的onCreate方法,但在活动开始时,它被更改为片段2,因此我必须在片段中滑动,以便代码开始正常工作...但我认为问题是在覆盖onResume和onPause方法上。

@Override
public void onResume() {
    super.onResume();
    sensorManager.registerListener(accelerometerEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);
}

@Override
public void onPause() {
    super.onPause();
    sensorManager.unregisterListener(accelerometerEventListener);
}
7qhs6swi

7qhs6swi1#

取决于一些因素,您可以在Fragments中覆盖setUserVisibilityHint()。如果您的Fragments被添加到FragmentPagerAdapterFragmentStatePagerAdapter,当Fragment可见时,这些适配器将在Fragment上调用此方法。在您的情况下,在Fragments中,您可以执行如下操作:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        sensorManager.registerListener(accelerometerEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);
    } else {
        sensorManager.unregisterListener(accelerometerEventListener);
    }
}
a11xaf1n

a11xaf1n2#

您可以尝试在Kotlin上创建一个扩展函数,以便仅在片段被附加到Activity时才运行代码块。因此,无论何时创建上下文,您都可以确保片段已被附加到Activity,并向用户显示。

internal inline fun Fragment.runIfFragmentIsAttached(block: () -> Unit) {
    context?.let { block() }
}

相关问题