深入分析动态管理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();
    }

}
时间: 2024-12-28 17:07:41

深入分析动态管理Fragment的相关文章

关于FragmentManager动态管理Fragment时Fragment生命周期的探究

Fragment是Android中的重要组件,在Android 3.0的时候添加进来. 关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCreate, onCreateView, onViewCreated, onActivityCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach. 当Fragment以静态的方式,即通过在布局文件中以

Android百日程序: Fragment动态管理和生命期

之前写过Fragment使用的程序,Fragment可以静态,也可以动态载入内存中的,这一章进一步看看如何动态地更换Fragment和看看Fragment生命期都有什么函数. 本章利用响应菜单点击事件,轮流载入不同的Fragment,显示不同的界面,效果如下: 开始的是没有载入Fragmen为空白: 点击菜单的NEXT FRAGMENT VIEW,就进入下一个界面,载入两个: 继续点击显示Fragment 1: 继续点击,显示Fragment2: 然后就是循环了: 如此循环显示不同画面. 一 首

管理Fragment

转载原地址:http://blog.csdn.net/harvic880925/article/details/44927375 相关文章: 1.<Fragment详解之一——概述>2.<Fragment详解之二——基本使用方法>3.<Fragment详解之三——管理Fragment(1)>4.<Fragment详解之四——管理Fragment(2)>5.<Fragment详解之五——Fragment间参数传递>6.<Fragment详解之

android 动态创建Fragment

前一遍文章我们讲了静态创建Fragment,这个在实际的开发中几乎不用,都是动态创建的,所谓动态创建就是根据某个条件动态创建Fragment, 现在创建一个android项目 dynamicFragment MainActivity.java package com.example.dynamicfragment; import android.app.Activity; import android.app.FragmentManager; import android.app.Fragmen

fragment 事务回滚 ---动态创建fragment

1 import java.util.Date; 2 import java.util.LinkedList; 3 4 import com.qianfeng.gp08_day23_fragment5.fragment.TestFragment; 5 6 import android.os.Bundle; 7 import android.app.Activity; 8 import android.app.Fragment; 9 import android.app.FragmentTrans

SqlServer性能优化 手工性能收集动态管理视图(三)

动态管理视图: 具体的实例语句:  --关于语句执行的基本情况 select * from sys.dm_exec_query_stats  --动态管理函数  需要提供参数  select top 10 execution_count,total_worker_time,t.text,total_worker_time/execution_count      as avgcpu from  sys.dm_exec_query_stats as s  cross apply sys.dm_ex

iscsi target存储技术-多路径 udev动态管理设备文件方法 nfs

惠普 戴尔 华为 目前国内服务器厂商排名 存储技术分类: SCSI小型计算机系统接口DAS直连式存储NAS网络技术存储SAN存储区域网络FC光纤通道 SCSI小型计算机系统接口 (U盘) DAS技术:直连式存储(将存储设备通过scsi接口或光纤通道直连到计算机上,不能实现数据与其它主机的共享,占用服务器操作系统资源cpu,io等,数据量越大,性能越差) NAS网络技术存储  做公享文件夹  (这是一种专用数据存储服务器,以数据为中心,将存储设备与服务器彻底分离,集中管理数据,提高性能,节省成本)

动态添加Fragment的报错信息

05-29 21:23:28.406: E/AndroidRuntime(23636): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.***.Main}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent

Android学习路线(二十三)运用Fragment构建动态UI——Fragment间通讯

先占个位置,下次翻译 :p In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with