fragment的生命周期
参考文章
setUserVisibleHint(isToUserVisible)
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onSaveInstanceState()
onStop()
onDestroyView()
onDestroy()
onDetach()
Fragment创建:
setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onStart()->onResume()
Fragment变为不可见状态(锁屏,回到桌面,被Activity完全覆盖):
onPause->onSaveInstanceState()->onStop()
Fragment变为可见状态(打开对话框)
onPause()->onSaveInstanceState()
Fragment由不可见变为可见
onStart()->onResume()
Fragment由部分可见变为可见
onResume()
退出应用
onPause()->onStop()->onDetroyView()->onDestroy()->onDetach() (正常退出是不会调用onSaveInstanceState()的)
Fragment被回收又重新创建(同横竖屏切换)
被回收:onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetached()
重新创建:onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint()
fragment与Activity组合(指示条位于顶端和底端)
当指示条位于顶端
android.support.design.widget.TabLayout + FragmentPagerAdapter + Fragment
如何利用一个Activity实现多个页面跳转
参考文章
···
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_click_button);
ButterKnife.bind(this);
// 获取传递过来的资源id值
intent = getIntent();
resId = intent.getIntExtra("resId", 0);
if (intent.getExtras() != null) {
resId = intent.getExtras().getInt("resId");
}
// 这里需要传递其他值可以自己定义
id = intent.getStringExtra("id");
/**
* 根据传递过来的不同的资源id值设置不同的fragment
*/
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.replace(R.id.fl_click_button, FragmentFactory.createById(resId));
ft.commit();
actionBarBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClickButtonActivity.this.finish();
}
});
}
···
同时使用同一个layout有利于title风格的统一
Fragment常见异常
参考文章
getActivity()空指针
原因,宿主activity已经与当前Fragment onDetach了,该Fragment的异步任务仍在执行,并且调用了getActivity()
解决方法:在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity
代替getActivity() —–这样可能会引起内存泄露,但是调用getActivity的时候本身已经内存泄露了
异常:Can not perform this action after onSaveInstanceState
在离开当前Activity的情况下,系统会调用onSaveInstanceState()帮助保存当前Activity的状态数据等,直到回到该Activity(onResume)之前,执行Fragment事务,就会抛出该异常。
解决方法:利用onActivityForResult/onNewIntent(),可以做到事务的完整性,不会丢失事务。
Fragment重叠异常
????????????????????????????????
如何使用Fragment
参考文章
如何传递数据
setArguments(Bundle args) ————> 在第二个Fragment中的oncreate()方法中调用getArguments()
如何创建Fragment对象