安卓動(dòng)態(tài)管理Fragment深入分析:“這幾個(gè)組件你知道嗎? ”
一、Fragment與Activity的關(guān)系
要理解動(dòng)態(tài)管理Fragment首先要理解一下Fragment與Activity的關(guān)系
Fragment可以理解為將Activity劃分為若干個(gè)片段,F(xiàn)ragment是Activity的一部分,生命周期是依賴Activity的,是不能單獨(dú)存在的。這樣不難理解所有Fragment的管理(查找、添加、刪除、替換)都應(yīng)該在Fragment所依賴的Activity中進(jìn)行,也就是Activity才是Fragment交互的場(chǎng)所,不要試圖在一個(gè)Fragment中去管理另一個(gè)Fragment雖然也可以實(shí)現(xiàn)要求的功能但是不符合規(guī)范的。要完成對(duì)Fragment的具體操作需要使用FragmentManager組件。
二、使用FragmentManager組件
使用FragmentManager組件的關(guān)鍵代碼如下:
- //1、創(chuàng)建FragmentManager組件
- FragmentManager fm=super.getSupportFragmentManager();
- //2、查詢方法,獲得Activity中某一個(gè)Fragment
- fm.findFragmentById(R.id.fooler)
- fm.findFragmentByTag(”tagName”)
- //3、動(dòng)態(tài)添加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傳遞數(shù)據(jù)
- f.setArguments(Bundle )方法傳遞數(shù)據(jù)
上述管理Fragment代碼應(yīng)組織在Fragment所屬的Activity中去,下面就通過一個(gè)案例來看看具體實(shí)現(xiàn).
三、實(shí)現(xiàn)案例
首先看一下本次的應(yīng)用案例(如圖所示),當(dāng)單擊底部***個(gè)區(qū)域和第二區(qū)域時(shí)實(shí)現(xiàn)中心區(qū)域的切換
界面分析:有三個(gè)區(qū)域 :頭部區(qū)域TitleFragment,中心區(qū)域是一個(gè)FrameLayout布局通過代碼動(dòng)態(tài)加載ContentFragment,底部區(qū)域FloorFragment
1、Activity的布局如下
3、ContentFragment代碼
- 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>
- 復(fù)制代碼
- 2、FloorFragment代碼
- 復(fù)制代碼
- 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中去實(shí)現(xiàn),降低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:
- //回調(diào)機(jī)制,調(diào)用實(shí)現(xiàn)類的方法
- onContentFragmentListener.setContentFragment("主面板Fragment");
- break;
- case R.id.list:
- onContentFragmentListener.setContentFragment("列表信息");
- break;
- }
- }
- }
- }
- 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);//注冊(cè)偵聽,傳入實(shí)現(xiàn)類對(duì)象
- 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();
- }
- }