• 深入分析动态管理Fragment


    一、Fragment与Activity的关系

      要理解动态管理Fragment首先要理解一下Fragment与Activity的关系

      Fragment可以理解为将Activity划分为若干个片段,Fragment是Activity的一部分,生命周期是依赖Activity的,是不能单独存在的。这样不难理解所有Fragment的管理(查找、添加、删除、替换)都应该在Fragment所依赖的Activity中进行,也就是Activity才是Fragment交互的场所,不要试图在一个Fragment中去管理另一个Fragment虽然也可以实现要求的功能但是不符合规范的。要完成对Fragment的具体操作需要使用FragmentManager组件。

    二、使用FragmentManager组件

       使用FragmentManager组件的关键代码如下:

    复制代码
    //1、创建FragmentManager组件
    FragmentManager fm=super.getSupportFragmentManager();
    //2、查询方法,获得Activity中某一个Fragment
    fm.findFragmentById(R.id.fooler) 
    fm.findFragmentByTag(”tagName”) 
    //3、动态添加Fragment
    fm.beginTransaction().add(R.id.content,contentFragment,"content").commit();
    //4、替换Fragment
    fm.beginTransaction().replace(R.id.OldFragment, newFragment).commit();
    //5、删除Fragment
    fm.beginTransaction().remove(R.id.myFragment).commit();
    //6、向Fragment传递数据
    f.setArguments(Bundle )方法传递数据
    复制代码

      上述管理Fragment代码应组织在Fragment所属的Activity中去,下面就通过一个案例来看看具体实现.

    三、实现案例

      首先看一下本次的应用案例(如图所示),当单击底部第一个区域和第二区域时实现中心区域的切换

      界面分析:有三个区域 :头部区域TitleFragment,中心区域是一个FrameLayout布局通过代码动态加载ContentFragment,底部区域FloorFragment

    1、Activity的布局如下

    复制代码
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <fragment android:id="@+id/fgTitle"
              android:layout_width="match_parent"
        android:layout_height="45dp"
               android:name="com.jereh.android.course.fragment.TitleFragment"
            />
        <FrameLayout android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:layout_below="@id/fgTitle"
            />
         <fragment android:id="@+id/floor"
              android:layout_width="match_parent"
            android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
            android:orientation="horizontal"
               android:name="com.jereh.android.course.fragment.FloorFragment"
            />        
    </RelativeLayout>
    复制代码

    2、FloorFragment代码 

    复制代码
    public class FloorFragment extends Fragment implements OnClickListener {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            View view=inflater.inflate(R.layout.floor_fragment, container,false);
            LinearLayout home=(LinearLayout)view.findViewById(R.id.home);
            LinearLayout list=(LinearLayout)view.findViewById(R.id.list);
            home.setOnClickListener(this);
            list.setOnClickListener(this);
            return view;
        }
        //定义接口,该接口在Activity中去实现,降低Activity与Fragment的耦合度
        public interface OnContentFragmentListener{
            void setContentFragment(String param);
        }
        private OnContentFragmentListener onContentFragmentListener;
        public void setOnContentFragmentListener(
                OnContentFragmentListener onContentFragmentListener) {
            this.onContentFragmentListener = onContentFragmentListener;
        }
        @Override
        public void onClick(View view) {
            // TODO Auto-generated method stub
            if(onContentFragmentListener!=null){
                switch(view.getId()){
                case R.id.home:
                    //回调机制,调用实现类的方法
                    onContentFragmentListener.setContentFragment("主面板Fragment");
                    break;
                case R.id.list:
                    onContentFragmentListener.setContentFragment("列表信息");
                    break;
                }    
            }
        }
    }
    复制代码

    3、ContentFragment代码 

    复制代码
    public class ContentFragment extends Fragment {
        private String title;
        public void setArguments(Bundle args) {
            title=args.getString("title");
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.content_fragment, container,false);
            if(title!=null)((TextView)view.findViewById(R.id.tvContent)).setText(title);
            return view;
        }
    }
    复制代码

    4、DynaFragmentActivity代码

    复制代码
    public  class  DynaFragmentActivity  extends  FragmentActivity implements FloorFragment.OnContentFragmentListener {
        private ContentFragment contentFragment;
        private FloorFragment floor;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.dyna_fragment_activity);
            initFragment();
        }
        private  void initFragment(){
        floor=(FloorFragment)super.getSupportFragmentManager().findFragmentById(R.id.floor);
            floor.setOnContentFragmentListener(this);//注册侦听,传入实现类对象
            contentFragment=new ContentFragment();
            FragmentManager fm=super.getSupportFragmentManager();
            fm.beginTransaction().add(R.id.content,contentFragment,"content").commit();
        }
        
        public void setFragment(Fragment fragment){
            getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
        }
        
        @Override
        public void setContentFragment(String param) {
            // TODO Auto-generated method stub
            Bundle bundle=new Bundle();
            bundle.putString("title", param);
            contentFragment=new ContentFragment();
            contentFragment.setArguments(bundle);
            super.getSupportFragmentManager().beginTransaction()
            .replace(R.id.content, contentFragment).commit();
        }
        
    }
  • 相关阅读:
    阅读配色
    电影资源下载
    处理原电影音频
    导入字幕实操
    视频剪辑实操
    录音实操
    py2neo的一些基础用法
    debug时报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xe6 in position 1023: unexpected end of data
    MYSQL MDL监控
    MYSQL 表磁盘大小(INNODB_SYS_TABLESPACES)
  • 原文地址:https://www.cnblogs.com/tangshiguang/p/6753648.html
Copyright © 2020-2023  润新知