检测片段何时变得可见
问题出现的原因:
- 当Fragment开始时,我们希望能够检测到其可见性。然而,Fragment的生命周期方法onStart并不在Fragment再次可见时调用。
解决方法:
- 通过重写Fragment的onStart方法,我们可以在Fragment开始时发送一个事件给Activity。
- 我们可以创建一个接口MyInterface,其中包含一个onFragmentVisible方法,用于在Fragment可见时回调给Activity。
- Activity需要实现这个接口,并在onStart方法中调用((MyInterface)getActivity()).onFragmentIsVisible(this)来接收Fragment可见的回调。
- 另一种更简单的方法是使用一个事件总线库,如RoboGuice的事件总线,Otto或EventBus。
下面是一种可能的解决方法的代码示例:
public class YourFragment extends Fragment { @Override public void onStart() { super.onStart(); ((MyInterface)getActivity()).onFragmentIsVisible(this); } } public interface MyInterface { void onFragmentVisible(Fragment fragment); } public class YourActivity extends AppCompatActivity implements MyInterface { @Override public void onFragmentVisible(Fragment fragment) { // 处理Fragment可见的逻辑 } }
注意:由于onStart方法不会在Fragment再次可见时被调用,所以可以尝试使用onResume方法替代。在Fragment的onResume方法中执行相同的操作即可。此外,由于onResume和onStart方法只有在父Activity的方法被调用时才会被调用,所以不需要实现其他接口进行回调。
当我们想要检查一个Fragment是否可见时,可以使用`Fragment.isVisible()`方法来实现。上面的示例代码展示了如何使用该方法来检查Fragment的可见性。但是,有时我们希望在Fragment变得可见时得到通知。
在`ViewPager`中,相邻的Fragment会被报告为可见。然而,我们并不能直接依赖于`Fragment.isVisible()`方法来判断一个Fragment是否可见。因此,我们需要找到一种方法来检测Fragment何时变得可见。
在这篇[Stack Overflow](http://stackoverflow.com/questions/14731589)上的回答中,有人提出了一个解决方法。他们发现`setUserVisibleHint()`方法会在Fragment变得可见或不可见时被调用。因此,我们可以重写这个方法,并在其中加入我们希望执行的代码。下面是一个示例:
@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Fragment becomes visible // Add your code here } else { // Fragment becomes invisible } }
通过重写`setUserVisibleHint()`方法,我们可以在Fragment变得可见或不可见时得到通知,并在其中执行我们希望执行的代码。这样就解决了我们想要检测Fragment何时变得可见的问题。
问题的原因是setUserVisibleHint方法不会自动被调用,而是在ViewPager中使用FragmentPageAdapter时才会调用。对于问题描述的场景,onHiddenChanged(boolean hidden)方法是合适的。根据文档的说明,该方法在Fragment的隐藏状态发生变化时被调用,但在Fragment的初始设置时不会被调用。
解决方法是使用onHiddenChanged(boolean hidden)方法,该方法在Fragment的隐藏状态发生变化时被调用。在ViewPager中使用FragmentPageAdapter时,该方法会被自动调用。
另外,可以使用setUserVisibleHint(boolean isVisibleToUser)方法。当isVisibleToUser参数设置为true时,表示Fragment应该显示。该方法在Fragment变为可见时被调用,我在ViewPager中使用了这个方法。
参考链接:stackoverflow.com/questions/14731589
问题的原因是setUserVisibleHint方法不会自动被调用,解决方法是使用onHiddenChanged(boolean hidden)方法或者setUserVisibleHint(boolean isVisibleToUser)方法来检测Fragment的可见状态。在ViewPager中使用FragmentPageAdapter时,这些方法会被自动调用。