zoukankan      html  css  js  c++  java
  • 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;
      }

     

     

     

     

     

  • 相关阅读:
    【Hadoop环境搭建】Centos6.8搭建hadoop伪分布模式
    【Java安装】Centos6.8 安装Java1.6
    【SVN】win7 搭建SVN服务器
    【KVM】Ubuntu14.04 安装KVM
    【VNC】Ubuntu14.04LTS下安装VNC View
    【虚拟化】支持IDE/SATA/SCSI
    【KVM安装】在Centos6.8中安装KVM
    【脚本】新增未扩展磁盘容量
    【SVN】自动定时更新
    【GIS】地球经纬度和米换算(转)
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/3140640.html
Copyright © 2011-2022 走看看