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/
小智 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)
归档时间: |
|
查看次数: |
27694 次 |
最近记录: |