Fragment

     Fragmeng优点

  1. Fragment替代TabActivity做导航,性能更好。
  2. Fragment解决Activity间的切换不流畅,轻量切换。
  3. Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
  4. Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
  5. Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
  6. Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
  7. Fragment 在4.2.版本中新增嵌套fragmeng使用方法,能够生成更好的界面效果。
  8. 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;
  }

 

 

 

 

 

原文地址:https://www.cnblogs.com/mingfeng002/p/3140640.html