zoukankan      html  css  js  c++  java
  • 深入分析动态管理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();
        }
        
    }
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/tangshiguang/p/6753648.html
Copyright © 2011-2022 走看看