查看寻呼机和片段的生命周期 [英] View pager and fragment lifecycle
问题描述
我有一个ViewPager,一次可以加载三个页面.如果我从第1页滑动到第2页,然后滑动到3,则第一页(片段)进入onPause()
.然后,如果我滑动到第二页,即使页面1对用户仍然不可见,第一页也会进入onResume()
.因此,我的问题是:如何区分代码中的第一页和第二页?例如,如果片段可见时我必须运行一段代码,那该怎么办?
I have a ViewPager that loads three pages at a time. If I swipe from page 1 to page 2 then to 3, the first page(fragment) goes to onPause()
. Then, if I swipe to the second page, 1st page comes to onResume()
even though the page 1 is still not visible to the user. So, my question is: how to distinguish between the first and second page in code? For example, if I have to run a piece of code when the fragment is visible, how is that done?
推荐答案
除了显示的片段之外,FragmentPagerAdapter还将其他片段保持为恢复状态.解决方案是实现自定义的OnPageChangeListener并为显示片段的时间创建一个新方法.
The FragmentPagerAdapter keeps additional fragments, besides the one shown, in resumed state. The solution is to implement a custom OnPageChangeListener and create a new method for when the fragment is shown.
1)创建LifecycleManager接口该接口将有两种方法,每个ViewPager的Fragment都将实现该方法.这些方法如下:
1) Create LifecycleManager Interface The interface will have two methods and each ViewPager’s Fragment will implement it. These methods Are as follows:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
2)让每个Fragment实现接口,为每个类声明添加iplements语句:
2) Let each Fragment implement the interface Add iplements statement for each class declaration:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
3)在每个片段中实现接口方法为了检查它是否确实按预期工作,我将只记录方法调用并显示Toast:
3) Implement interface methods in each fragment In order to check that it really works as expected, I will just log the method call and show Toast:
@Override
public void onPauseFragment() {
Log.i(TAG, "onPauseFragment()");
Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
4)更改ViewPager页面上的调用接口方法您可以在ViewPager上设置OnPageChangeListener并在每次ViewPager显示另一个页面时获取回调:
4) Call interface methods on ViewPager page change You can set OnPageChangeListener on ViewPager and get callback each time when ViewPager shows another page:
pager.setOnPageChangeListener(pageChangeListener);
5)实现OnPageChangeListener来调用您的自定义生命周期方法
5) Implement OnPageChangeListener to call your custom Lifecycle methods
Listener知道新位置,并且可以在PagerAdapter的帮助下在new Fragment上调用接口方法.我可以在此处调用onResumeFragment()获取新片段,并在当前片段上调用onPauseFragment().
Listener knows the new position and can call the interface method on new Fragment with the help of PagerAdapter. I can here call onResumeFragment() for new fragment and onPauseFragment() on the current one.
我还需要存储当前片段的位置(最初,当前位置等于0),因为我不知道用户是从左向右滚动还是从右向左滚动.明白我在代码中的意思:
I need to store also the current fragment’s position (initially the current position is equal to 0), since I don’t know whether the user scrolled from left to right or from right to left. See what I mean in code:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
我没有写代码.此处的完整教程: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-includes-source-code/
I didn't write the code. Full tutorial here: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/
这篇关于查看寻呼机和片段的生命周期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!