Fragmeng优点
- Fragment替代TabActivity做导航,性能更好。
- Fragment解决Activity间的切换不流畅,轻量切换。
- Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
- Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
- Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
- Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
- Fragment 在4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。
- Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能
Fragmeng使用
1. 两种添加方法
在activity的layout文件中声明fragment
通过代码将fragment添加到一个已存在的ViewGroup
2. Fragmeng与Activity交互
Fragmeng通过getActivity()获得所在Activity上下文
Activity通过getFragmentManager()获得Fragmeng实例(findFragmentById,findFragmentByTag);
通过FragmentTransaction可以增加、移除或者代替Fragments;
通过fragmentTransaction.addToBackStack()可以把fragmeng保存到栈,响应后退按钮;
3. 使用Fragment扩展类更轻松
1.DialogFragment
2.ListFragment
3.WebViewFragment
FragmentTransaction ft = fm.beginTransaction(); ProductListActivty groupActivty=new ProductListActivty(); Bundle bundle=new Bundle(); bundle.putString("category",categoryId); groupActivty.setArguments(bundle); ft.replace(R.id.container, groupActivty); ft.addToBackStack(null); ft.commit();
注意在fragment出栈的时候会从onCreateView()开始
Fragment通过实现onCreateOptionsMenu()方法给Activity的可选菜单(包括动作栏)提供菜单项,但是为了这个方法能够接受调用,必须在onCreate()方法中调用setHasOptionsMenu()方法来指示这个Fragment应该作为可选菜单的添加项(否则,这个Fragment不接受对onCreateOptionsMenu()方法的调用)。
然后,你把来自Fragment的要添加到可选菜单中项目追加到既存的菜单中。当菜单项被选择时,这个Fragment也接受onOptionsItemSelected()的回调。
当里层嵌套的子Fragment开启一个startActivityForResult并返回结果给onActivityForResult,事件传递不到里层嵌套的子Fragment
看了下android的V4源码,在SherlockFragmentActivity的
Activity(继承自SherlockFragmentActivity)中代码如下:
private Fragment mFragmentForResult; //the fragment t @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { int index = requestCode>>16; if(index !=0){ index--; if(mFragmentForResult !=null){ mFragmentForResult.onActivityResult(requestCode&0xffff, resultCode, data); } } } @Override public void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) { mFragmentForResult = fragment; super.startActivityFromFragment(fragment, intent, requestCode); }
嵌套的子Fragment 调用方法
Intent intent = new Intent(); intent.setClass(mContext, BrandSelectActivity.class); BaseActivity b=((BaseActivity)mContext); b.startActivityFromFragment(this, intent, RESULT_BRAND_SELECT);
当Fragment的栈里面有几个fragment的时候,这个时候如果是几个fragment状态是hide,当你触摸当前fragment的时候,下层的fragment的事件被触发,这是由于Touch事件泄露传到了下层中。解决方法就是拦截fragment的
public void onViewCreated(View view, Bundle savedInstanceState) { // 拦截触摸事件,防止泄露下去 view.setOnTouchListener(this); super.onViewCreated(view, savedInstanceState); }
//onTouch事件 将上层的触摸事件拦截 @Override public boolean onTouch(View v, MotionEvent event) { return true; }