fragment的意思是碎片,最容易见到的地方是首页,底部有n个导航,通过切换导航按钮来显示不同的fragment。关于fragment,我们需要弄清三个点:1.fragment与activity是如何交互的;2.fragment的切换方式;3.fragment与activity的生命周期的异同。
fragment与activity的生命周期:
fragment的生命周期是建立在activity的基础上,注意fragment生命周期方法出onCreateView外都需加super方法,详图如下
fragment与activity的交互方式:
activity—>fragment:在activity中传值给frag,frag通过setArgument,并且通过getArgument获取值,如下代码是在as创建fragment自动生成,fragment通过单例模式创建对象,在activity中初始化并传值到frag
Activity类:
mOneFrag = OneFrag.newInstance("one", "1");
Fragment类:
private String mParam1;
private String mParam2;
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static OneFrag newInstance(String param1, String param2) {
OneFrag fragment = new OneFrag();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
fragment—>activity:有两种方式
- 在activity中通过以下代码获取fragment对象
mCurrentFrag = getSupportFragmentManager().findFragmentById(R.id.frag_content);
在fragment中增加一个接口,并在activity中实现,此代码亦为fragment自动生成,接口中方法可自行根据实际情况增减
Fragment类:
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
fragment切换方式:
有两种切换方式,replace和add show hide。
- replce模式指当fragment切换时都会重新运行生命周期方法,如果fragment中有数据获取操作,会造成数据重复加载
- add模式指用add方式来进行show和hide,优点是不会重新运行生命周期方法
但是这两种也有缺点,会造成frag重叠问题。。!可通过开启安卓机的开发者模式下的不保留活动选项来复现问题
尤其是activity被回收时系统保存了frag的状态,activity恢复时显示了frag的状态,又因为activity重新运行onCreate方法,会再次绑定frag造成重叠,重叠的原理是FragmentState没有保存Fragment的显示状态,即mHidden
,导致页面重启后,该值为默认的false,即show状态,所以导致了Fragment的重叠。
如何解决问题呢,我们acitivity恢复时会重新重新运行oncreate方法,则就在onCreate中判断。
Activity类:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFragment();
if (savedInstanceState == null) {
customFrag(mOneFrag);
}else {
mCurrentFrag = getSupportFragmentManager().findFragmentById(R.id.frag_content);
}
}