你的位置:首页 > 操作系统

[操作系统]深入分析动态管理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中某一个Fragmentfm.findFragmentById(R.id.fooler) fm.findFragmentByTag(”tagName”) //3、动态添加Fragmentfm.beginTransaction().add(R.id.content,contentFragment,"content").commit();//4、替换Fragmentfm.beginTransaction().replace(R.id.OldFragment, newFragment).commit();//5、删除Fragmentfm.beginTransaction().remove(R.id.myFragment).commit();//6、向Fragment传递数据f.setArguments(Bundle )方法传递数据

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

三、实现案例

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

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

1、Activity的布局如下

<RelativeLayout ="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();  }  }