查看寻呼机和片段生命周期 [英] View pager and fragment lifecycle

查看:50
本文介绍了查看寻呼机和片段生命周期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个一次加载三个页面的 ViewPager.如果我从第 1 页滑动到第 2 页,然后再滑动到第 3 页,则第一页(片段)将转到 onPause().然后,如果我滑动到第二页,即使第 1 页对用户仍然不可见,第 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 以调用您的自定义 Lifecycle 方法

5) Implement OnPageChangeListener to call your custom Lifecycle methods

Listener 知道新的位置,可以在 PagerAdapter 的帮助下调用新的 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-include-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆