查看寻呼机和片段生命周期

shr*_*yas 37 android android-lifecycle android-fragments android-viewpager

我有一个ViewPager,一次加载三个页面.如果我从第1页到第2页再扫描到第3页,则第一页(片段)转到 onPause().然后,如果我滑动到第二页,onResume()即使页面1仍然对用户不可见,第一页也会出现.所以,我的问题是:如何区分代码中的第一页和第二页?例如,如果我必须在片段可见时运行一段代码,那么它是如何完成的?

小智 42

除了显示的片段之外,FragmentPagerAdapter还将其他片段保持在恢复状态.解决方案是实现自定义OnPageChangeListener并为显示片段时创建新方法.

1)创建LifecycleManager接口该接口将有两个方法,每个ViewPager的Fragment将实现它.这些方法如下:

public interface FragmentLifecycle {

    public void onPauseFragment();
    public void onResumeFragment();

}
Run Code Online (Sandbox Code Playgroud)

2)让每个Fragment为每个类声明实现接口Add iplements语句:

public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
Run Code Online (Sandbox Code Playgroud)

3)在每个片段中实现接口方法为了检查它是否真的按预期工作,我将只记录方法调用并显示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(); 
}
Run Code Online (Sandbox Code Playgroud)

4)在ViewPager页面上调用接口方法更改您可以在ViewPager上设置OnPageChangeListener,并在每次ViewPager显示另一个页面时获取回调:

pager.setOnPageChangeListener(pageChangeListener);
Run Code Online (Sandbox Code Playgroud)

5)实现OnPageChangeListener以调用自定义生命周期方法

监听器知道新位置,并可以在PagerAdapter的帮助下调用新Fragment上的接口方法.我可以在这里调用onResumeFragment()来获取当前新片段和onPauseFragment().

我还需要存储当前片段的位置(最初当前位置等于0),因为我不知道用户是从左向右还是从右向左滚动.看看我在代码中的意思:

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) { }
};
Run Code Online (Sandbox Code Playgroud)

我没有写代码.完整的教程:http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

  • 不工作 大多数适配器'`getItem(pos)`返回片段的新实例,但是我们需要将缓存添加到片段管理器片段中.因此,您将在新创建的未附加到活动实例上调用`.onPauseFragment()`.不要复制粘贴未经测试的代码.为什么它被接受了 (5认同)
  • 就我而言'getItem();' 没有视图的返回片段.我通过使用'instantiateItem'解决了它.http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#instantiateItem(android.view.ViewGroup,int) (3认同)

小智 9

如果你的Fragment扩展android.support.v4.app.Fragment

你可以使用它,它适合我.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (!isVisibleToUser) {
        //do sth..
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

用户方法 pager.setOffscreenPageLimit(numbr) 设置要在堆栈中保存的片段数量。

  • 默认值为1。这意味着前一个和后一个片段保持空闲状态。 (4认同)