一、什么是Fragment
fragment可以看做是一个依附于activity存在的布局,他必须在activity中被调用,不可单独出现(其生命周期也与activity一一对应),主要用来实现不同尺寸安卓设备的碎片化问题,可以让同一个应用在不同设备上有不同的显示效果。
二、Fragment的生命周期
和activity的生命周期一一对应。
需要注意的是:fragment在创建时后于其依附的activity被创建,在销毁时先于其依附的activity被销毁。
1、创建时:
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
2、对用户可见:
- onstart()
- onResume()
3、进入后台模式时:
- onPause()
- onstop()
4、退出时:
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
三、Fragment的加载方式
1、静态加载
即直接将fragment的类名写在activity的布局文件中,通常需要用在onCreateView方法中用inflater方法将布局转换为view,再将其返回给activity调用。
@Override
publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//将布局文件转化为一个view
//需要加载的布局,父view,是否加入到父view中
View view = inflater.inflate(R.layout.fragment,container,false);
TextView textView = (TextView) view.findViewById(R.id.fragment_text);
textView.setText("静态加载fragment");
Button button = (Button) view.findViewById(R.id.fragment_button);
button.setText("获取数据");
button.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
String text = getAaa();
Toast.makeText(getActivity(),"text:"+text, Toast.LENGTH_SHORT).show();
}
});
returnview;
}
2、动态加载
即使用fragmentManager来动态加载到activity的某个布局中。
Fragment fragment2 =newMyFragment2();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//第一个参数:需要加入的布局
//第二个参数:需要加入的fragment
fragmentTransaction.add(R.id.frame,fragment2);
fragmentTransaction.addToBackStack(null);//添加返回上一层的事务,否则按返回直接退出程序。
fragmentTransaction.commit();//一定要在最后执行commit()事务,执行这个操作。
四、Fragment与Activity之间的消息传递
1、activity向fragement传递消息
通过setArguments(bundle)和getArguments()方法即可。
activity中
Fragment fragment5 =newMyFragment5();
Bundle bundle =newBundle();
bundle.putString("name",text);
fragment5.setArguments(bundle);
fragment5中
text= getArguments().get("name")+"";
也可通过fragmentManager.findFragmentById(R.id.main4_fragment)的方式来静态传值。用的比较少,在此不详述。
2、fragement向activity传递消息
一般需要通过一个回调方法来传递消息。
fragment中
privateStringcode="Thank you,Activity!";
privateMyListenerlistener;
public interfaceMyListener{//此为回调接口
public voidthink(String code);
}
@Override
public voidonAttach(Context context) {
listener= (MyListener) context;
super.onAttach(context);
}
publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//将布局文件转化为一个view
View view = inflater.inflate(R.layout.fragment2,container,false);
listener.think(code);//在初始化时执行回调方法。
returnview;
}
activity中
实现fragment中的接口即可获得消息。
public class MainActivity4 extends Activity implements MyFragment5.MyListener{
public void think(String code) {
String code = code;
}
}