In-depth analysis of Android dynamic management fragment: "Do you know these components?"

In-depth analysis of Android dynamic management fragment: "Do you know these components?"

1. The relationship between Fragment and Activity

To understand dynamic management of Fragment, you must first understand the relationship between Fragment and Activity

Fragment can be understood as dividing Activity into several fragments. Fragment is part of Activity, and its life cycle depends on Activity. It cannot exist independently. It is not difficult to understand that all Fragment management (finding, adding, deleting, replacing) should be done in the Activity that Fragment depends on, that is, Activity is the place for Fragment interaction. Don't try to manage another Fragment in a Fragment. Although it can achieve the required functions, it does not meet the specifications. To complete specific operations on Fragment, you need to use FragmentManager component.

2. Use FragmentManager component

The key code for using the FragmentManager component is as follows:

  1. //1. Create a FragmentManager component  
  2. FragmentManager fm= super .getSupportFragmentManager();
  3. //2. Query method to get a Fragment in Activity  
  4. fm.findFragmentById(R.id.fooler)
  5. fm.findFragmentByTag("tagName")
  6. //3. Dynamically add Fragment  
  7. fm.beginTransaction().add(R.id.content,contentFragment, "content" ).commit();
  8. //4. Replace Fragment  
  9. fm.beginTransaction().replace(R.id.OldFragment, newFragment).commit();
  10. //5. Delete Fragment  
  11. fm.beginTransaction().remove(R.id.myFragment).commit();
  12. //6. Pass data to Fragment  
  13. f.setArguments(Bundle) method passes data

     

The above management Fragment code should be organized in the Activity to which the Fragment belongs. Let's take a look at the specific implementation through a case.

3. Implementation Case

First, let's take a look at the application case (as shown in the figure). When you click the first area and the second area at the bottom, the center area is switched.

Interface analysis: There are three areas: the header area TitleFragment, the center area is a FrameLayout layout that dynamically loads ContentFragment through code, and the bottom area FloorFragment

1. The layout of Activity is as follows

  1. RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"  
  2. android:layout_width= "match_parent"  
  3. android:layout_height= "match_parent" >
  4. <fragment android:id= "@+id/fgTitle"  
  5. android:layout_width= "match_parent"  
  6. android:layout_height= "45dp"  
  7. android:name= "com.jereh.android.course.fragment.TitleFragment"  
  8. />
  9. <FrameLayout android:id= "@+id/content"  
  10. android:layout_width= "match_parent"  
  11. android:layout_height= "match_parent"  
  12. android:layout_below= "@id/fgTitle"  
  13. />
  14. <fragment android:id= "@+id/floor"  
  15. android:layout_width= "match_parent"  
  16. android:layout_height= "wrap_content"  
  17. android:layout_alignParentBottom= "true"  
  18. android:orientation= "horizontal"  
  19. android:name= "com.jereh.android.course.fragment.FloorFragment"  
  20. />
  21. </RelativeLayout>
  22.  
  23. Copy code
  24. 2. FloorFragment code
  25. Copy code
  26.  
  27. public   class FloorFragment extends Fragment implements OnClickListener {
  28. @Override  
  29. public   void onAttach(Activity activity) {
  30. super .onAttach(activity);
  31.  
  32. }
  33. @Override  
  34. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  35. Bundle savedInstanceState) {
  36. // TODO Auto-generated method stub  
  37. View view=inflater.inflate(R.layout.floor_fragment, container, false );
  38. LinearLayout home=(LinearLayout)view.findViewById(R.id.home);
  39. LinearLayout list=(LinearLayout)view.findViewById(R.id.list);
  40. home.setOnClickListener( this );
  41. list.setOnClickListener( this );
  42. return view;
  43. }
  44. //Define an interface that is implemented in the Activity to reduce the coupling between the Activity and the Fragment  
  45. public   interface OnContentFragmentListener{
  46. void setContentFragment(String param);
  47. }
  48. private OnContentFragmentListener onContentFragmentListener;
  49. public   void setOnContentFragmentListener(
  50. OnContentFragmentListener onContentFragmentListener) {
  51. this .onContentFragmentListener = onContentFragmentListener;
  52. }
  53. @Override  
  54. public   void onClick(View view) {
  55. // TODO Auto-generated method stub  
  56. if (onContentFragmentListener!= null ){
  57. switch (view.getId()){
  58. case R.id.home:
  59. //Callback mechanism, calling the method of the implementation class  
  60. onContentFragmentListener.setContentFragment( "Main Panel Fragment" );
  61. break ;
  62. case R.id.list:
  63. onContentFragmentListener.setContentFragment( "list information" );
  64. break ;
  65. }
  66. }
  67. }
  68. }
3. ContentFragment code
  1. public   class ContentFragment extends Fragment {
  2. private String title;
  3. public   void setArguments(Bundle args) {
  4. title=args.getString( "title" );
  5. }
  6. @Override  
  7. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  8. Bundle savedInstanceState) {
  9. View view=inflater.inflate(R.layout.content_fragment, container, false );
  10. if (title!= null )((TextView)view.findViewById(R.id.tvContent)).setText(title);
  11. return view;
  12. }
  13. }

     

4. DynaFragmentActivity code

  1. public   class DynaFragmentActivity extends FragmentActivity implements FloorFragment.OnContentFragmentListener {
  2. private ContentFragment contentFragment;
  3. private FloorFragment floor;
  4. @Override  
  5. protected   void onCreate(Bundle savedInstanceState) {
  6. super .onCreate(savedInstanceState);
  7. super .setContentView(R.layout.dyna_fragment_activity);
  8. initFragment();
  9. }
  10. private   void initFragment(){
  11. floor=(FloorFragment) super .getSupportFragmentManager().findFragmentById(R.id.floor);
  12. floor.setOnContentFragmentListener( this ); //Register to listen, pass in the implementation class object  
  13. contentFragment= new ContentFragment();
  14. FragmentManager fm= super .getSupportFragmentManager();
  15. fm.beginTransaction().add(R.id.content,contentFragment, "content" ).commit();
  16. }
  17.  
  18. public   void setFragment(Fragment fragment){
  19. getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
  20. }
  21.  
  22. @Override  
  23. public   void setContentFragment(String param) {
  24. // TODO Auto-generated method stub  
  25. Bundle bundle = new Bundle();
  26. bundle.putString( "title" , param);
  27. contentFragment= new ContentFragment();
  28. contentFragment.setArguments(bundle);
  29. super .getSupportFragmentManager().beginTransaction()
  30. .replace(R.id.content, contentFragment).commit();
  31. }
  32.  
  33. }

<<:  The future of mobile is not in apps

>>:  Hundreds of iOS apps exposed to FREAK vulnerability risk

Recommend

Whose company is Alibaba?

Last Friday, Alibaba was listed on the New York S...

Three ways to remove the back button text in the iOS navigation bar

[[403792]] This article is reprinted from the WeC...

Does Microsoft still have a chance in the hardware field?

This week, Microsoft released the third generatio...

APP promotion: 95% of people use these 5 conversion strategies incorrectly

The conversion rate optimization strategy is inef...

Can Xiaomi become a Fortune 500 company?

This article is reprinted from Fortune Chinese we...

If this symptom occurs in the arm, it may be a sign of a heart attack!

Mention of myocardial infarction I believe many p...

Very down-to-earth! Android 10 gets new features

According to foreign media reports, developers re...