一、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();
} }

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

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

    Fragment是Android中的重要组件,在Android 3.0的时候添加进来. 关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCrea ...

  2. Android 动态创建Fragment

    Fragment是activity的界面中的一部分或一种行为.可以把多个Fragment组合到一个activity中来创建一个多界面并且可以在多个activity中重用一个Fragment.可以把Fr ...

  3. Fragment详解之三——管理Fragment(1)

    相关文章: 1.<Fragment详解之一--概述>2.<Fragment详解之二--基本使用方法>3.<Fragment详解之三--管理Fragment(1)>4 ...

  4. 管理Fragment

    转载原地址:http://blog.csdn.net/harvic880925/article/details/44927375 相关文章: 1.<Fragment详解之一——概述>2.& ...

  5. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  6. spring security动态管理资源结合自定义登录页面

    如果想将动态管理资源与自定义登录页面一起使用,最简单的办法就是在数据库中将登录页面对应的权限设置为IS_AUTHENTICATED_ANONYMOUSLY. 因此在数据库中添加一条资源信息. INSE ...

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

    动态管理视图: 具体的实例语句:  --关于语句执行的基本情况 select * from sys.dm_exec_query_stats --动态管理函数  需要提供参数  select top 1 ...

  8. 使用Fragment 实现动态UI 和 动态添加Fragment

    首先写好每个Fragment: 1.在第一个Fragment写一个按钮,使其加载下一个Fragment 布局: <LinearLayout xmlns:android="http:// ...

  9. (转)android Fragments详解四:管理fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

随机推荐

  1. Html 学习

    行内元素和块级元素 行内元素(行级元素) 多个元素会在一行内显示 块级元素 独立成行 注意:块级元素能够嵌套行内元素 <div> <span></span> < ...

  2. .net 爬虫框架技术选型

    个人认为爬虫框架分抓取框架和分析框架 1)抓取框架 .net 市面上好的似乎不多,选择要素分两种:1.轻量型,2.重量型. 1. 轻量型是可以定制一些特殊的功能或者插件开关形式.总体性能高,速度快. ...

  3. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  4. 制作Docker镜像

    编写DockerFile 这个DockerFile是一个制作镜像的配方,用于描述这些文件,环境,和命令.在Linux.macOS的窗口终端中,或者windows的命令提示符下,执行下面的步骤,切记如果 ...

  5. 本地Server发布外网Web应用(Oray实现)

    主要讲解如何将本地当做服务器,发布Web应用至外网访问.   准备条件: 1.web应用服务(此处为Tomcat作为web应用服务器): 2.花生壳应用:   第一步,正常搭建本地web项目,应用名为 ...

  6. [luogu P2184] 贪婪大陆 [树状数组][线段树]

    题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁. 小 ...

  7. js校验身份证

    1 <%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> &l ...

  8. Android高效内存之让你的图片省内存

    Android高效内存之让你的图片省内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可 ...

  9. 【CSS】font样式简写(转)- 不是很建议简写

    一.字体属性主要包括下面几个 font-family,font-style,font-variant,font-weight,font-size,font font-family(字体族): “Ari ...

  10. 还在为CSS布局发愁?你该看看这7条原则

    一.网页结构分析七条原则 这以下7个原则是经过多年网站实战经验之后的总结,只要掌握这7个原则,可以解决大部分在编写网站布局中的问题. 1.先结构后样式. 2.能用CSS表现出来的效果,就尽量少用图像. ...