Fragment
碎片布局。android3.0之后的新功能,Fragment需要依赖于Activity而存在,不能独立使用。
Fragment的定义
public class LeftFragment extends ListFragment {
private String[] items = { "字符串1", "字符串2", "字符串
3", "字符串4", "字符串5", "字符串6" };
// 监听到所依赖的Activity已经onCreate时触发
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Fragment中可以通过getActivity()获取所依赖的Activity对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, items);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Toast.makeText(getActivity(), "点击了"+position, 2000).show();
}
}
两种添加到Activity的方式
第一种:在xml中使用
Java中动态管理Fragment
1、定义Fragment
public class RightFragment extends Fragment {
public static RightFragment getInstance(String content,int position){
RightFragment f = new RightFragment();
Bundle b = new Bundle();
b.putString("name", content);
b.putInt("index",position);
//记录一些初始参数(放在显示之前)
f.setArguments(b);
return f;
}
// 当Activity添加Fragment之后从该Fragment上获取布局的方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.right_fragment_layout, null);
TextView tv = (TextView) layout.findViewById(R.id.m_tx);
String content = getArguments().getString("name");
tv.setText(content);
return layout;
}
}
2、使用FragmentManager和FragmentTransaction来操作Fragment,在Fragment中可以使用getFragmentManager()得到碎片管理器
从布局中加载Fragment
getFragmentManager().findFragmentById(R.id.content);
//碎片操作工具(显示、隐藏、添加、移除、替换、绑定、取消绑定这样的管理)
FragmentTransaction ft = getFragmentManager().beginTransaction();
//设置操作动画
ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
//替换
ft.replace(R.id.content, fragment);
//提交操作
ft.commit();
回退栈:可以在提交之前使用addToBackStack方法添加回退栈
//可以添加操作到回退栈中
ft.addToBackStack(null);
注意:FragmentTransaction的conmmit方法必须要在Activity保存状态之前使用,如果保存状态之后用则会导致异常,为了防止异常可以使用
ft.commitAllowingStateLoss();
Fragment生命周期
onAttach: Fragment被加入到Activity中时触发
onCreate: Fragment创建完毕
onCreateView: Activity从Fragment身上拿到布局时触发
onActivityCreate: 当Activity的onCreate方法调用完毕时触发
onStart: 启动
onResume: 恢复
运行ing...
onPause: 暂停
onStop: 停止
onDestroyView:销毁布局
onDestroy: 碎片进入销毁
onDetach: fragment从Activity中移除(取消了关联)
Fragment管理
建议使用兼容包v4包中的Fragment,Activity要继承FragmentActivity或者其子类
Activity: getSupportFragmentManager()
Fragment: getFragmentManager() ,getChildFragmentManager()前者得到的是Activity中的管理器,后者得到的是Fragment中管理子(嵌套的)Fragment的管理器
处理Fragment的存活情况可以使用FragmentTransaction
FragmentTransaction ft = mFragmentManager.beginTransaction();
//Fragment的处理
ft.commit();
管理:
显示有关的:add attach(已经存在容器中,会触发onCreateView)
show(已经存在容器中,不会触发任何声明周期方法)
隐藏:remove detach(会destroyView) hide(不会destroyView)
replace 等价于 add新Fragment remove旧Fragment
ViewPager+Fragment
FragmentPagerAdapter或者FragmentStatePagerAdapter,可以帮助ViewPager管理多个Fragment的切换。
public class MyPagerAdapter extends FragmentPagerAdapter {
private Fragment[] fragments;
public MyPagerAdapter(FragmentManager fm, Fragment[] fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return null == fragments ? 0 : fragments.length;
}
}
Fragment中跳转到Activity
直接跳转
Intent it = new Intent(getActivity(), Activity01.class);
startActivity(it);
为了结果跳转
Intent it2 = new Intent(getActivity(), Activity01.class);
startActivityForResult(it2, 1);
需要在Fragment中重写onActivityResult方法,注意该Fragment
所依赖的Activity中如果也重写了onActivityResult,那么该方法一定要保留
super.onActivityResult(arg0, arg1, arg2);
否则Fragment会收不到ActivityResult这个结果