最近在做一个项目中用到了viewpager+fragment实现的功能,但是出现了一些问题,尤其是fragment生命周期的问题,有人会说了这生命周期有什么难的,不就是按顺序回调么,显示回调哪些,隐藏回调哪些…… 这大家都知道的
其实这种问题经常出现在用到的fragment是相同的,比如说做题同一种题型我们就会用相同的fragment,因为里面的业务逻辑都是一样的,所以在这个时候我们切换题目的时候,就会因为生命周期而引起的业务逻辑上的问题。尤其在fragment里面用到单例模式时更要注意。
下面就通过代码示例讲一下viewpager切换fragment时生命周期的变化,以及每个fragment中调用的先后顺序(顺序这个很重要,顺序这个很重要,顺序这个很重要)。
首先新建一个Activity:
public class RecordActivity extends AppCompatActivity {
ViewPager viewPager;
List list;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record_view);
viewPager = findViewById(R.id.viewpager);
list = new ArrayList<>();
list.add(PlusOneFragment.newInstance());
list.add(PlusTwoFragment.newInstance());
list.add(PlusThreeFragment.newInstance());
list.add(PlusFourFragment.newInstance());
FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int i) {
return list.get(i);
}
@Override
public int getCount() {
return list.size();
}
};
viewPager.setAdapter(adapter);
}
@Override
protected void onStart() {
super.onStart();
Log.e("Activity","onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e("Activity","onResume");
}
}
R.layout.activity_record_view如下:
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
RecordActivity里面很简单,就是初始化viewpager并设置adapter,这里用的是FragmentSta