Fragment
Android是在Android 3.0 (API level 11)开始引入Fragment的。
可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。
可以把Fragment设计成可以在多个Activity中复用的模块。
当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。
如图:
Fragment的生命周期
因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。
如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。
但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。
当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。
Fragment的使用相关
使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。
今天我就模仿微信界面写个fragment例子,来小结下fragment学习。
首先添加四个要添加的fragment类,如图:
weixinframent.java代码:
1 package com.example.fragmentdemo; 2 3 import android.app.Fragment; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 9 public class weixinframent extends Fragment 10 { 11 12 public static final String FRAGMENT_TAG = weixinframent.class.getName();13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, 15 Bundle savedInstanceState) 16 { 17 return inflater.inflate(R.layout.layout1, container, false); 18 } 19 20 }
telfragment.java代码:
1 package com.example.fragmentdemo; 2 3 import android.app.Fragment; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 9 public class telfragment extends Fragment 10 { 11 12 public static final String FRAGMENT_TAG = telfragment.class.getName();13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, 15 Bundle savedInstanceState) 16 { 17 return inflater.inflate(R.layout.layout2, container, false); 18 } 19 20 }
findfragment.java代码:
1 package com.example.fragmentdemo; 2 3 import android.app.Fragment; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 9 public class findfragment extends Fragment 10 { 11 12 public static final String FRAGMENT_TAG = findfragment.class.getName();13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, 15 Bundle savedInstanceState) 16 { 17 return inflater.inflate(R.layout.layout3, container, false); 18 } 19 20 }
mefragment.java代码:
1 package com.example.fragmentdemo; 2 3 import android.app.Fragment; 4 import android.os.Bundle; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 9 public class mefragment extends Fragment 10 { 11 public static final String FRAGMENT_TAG = mefragment.class.getName();12 @Override 13 public View onCreateView(LayoutInflater inflater, ViewGroup container, 14 Bundle savedInstanceState) 15 { 16 return inflater.inflate(R.layout.layout4, container, false); 17 } 18 19 }
然后增加四个fragment对应的布局文件,如图:
layout1.xml:
1 26 7 12 13
layout2.xml:
1 26 7 12 13
layout3.xml:
1 26 7 12 13
layout4.xml:
1 26 7 12 13
接着修改主布局文件:
1 27 8 155 156 157 15812 13 18 19 25 26 32 33 130 13139 40 57 5847 48 56 65 66 105 10669 70 10475 76 93 9482 83 92 102 103 112 113 119 120 129 137 138 144 145 154 163 164 165 166 167
最后修改MainActivity文件:
1 package com.example.fragmentdemo; 2 3 import android.app.Activity; 4 import android.app.Fragment; 5 import android.app.FragmentManager; 6 import android.app.FragmentTransaction; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.LinearLayout; 11 12 public class MainActivity extends Activity implements OnClickListener { 13 14 private LinearLayout m_weixintab; 15 private LinearLayout m_teltab; 16 private LinearLayout m_findtab; 17 private LinearLayout m_metab; 18 private LinearLayout m_curtab; 19 20 private weixinframent mweixin = null; 21 private telfragment mtel = null; 22 private findfragment mfind = null; 23 private mefragment mMe = null; 24 private Fragment mCurrentfragment = null; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 m_weixintab = (LinearLayout) findViewById(R.id.tab1_layout); 32 m_teltab = (LinearLayout) findViewById(R.id.tab2_layout); 33 m_findtab = (LinearLayout) findViewById(R.id.tab3_layout); 34 m_metab = (LinearLayout) findViewById(R.id.tab4_layout); 35 36 m_weixintab.setOnClickListener(this); 37 m_teltab.setOnClickListener(this); 38 m_findtab.setOnClickListener(this); 39 m_metab.setOnClickListener(this); 40 41 m_weixintab.setSelected(true); 42 m_weixintab.setVisibility(View.VISIBLE); 43 44 if (null == savedInstanceState) { 45 mCurrentfragment = getweixinFragment(); 46 FragmentTransaction ft = getFragmentManager().beginTransaction(); 47 ft.add(R.id.content_frame, mCurrentfragment, 48 weixinframent.FRAGMENT_TAG); 49 ft.commit(); 50 } else { 51 mCurrentfragment = getweixinFragment(); 52 } 53 54 m_curtab = m_weixintab; 55 56 } 57 58 private weixinframent getweixinFragment() { 59 weixinframent fragment = (weixinframent) getFragmentManager() 60 .findFragmentByTag(weixinframent.FRAGMENT_TAG); 61 if (null == fragment) { 62 fragment = new weixinframent(); 63 } 64 return fragment; 65 } 66 67 private telfragment gettelFragment() { 68 telfragment fragment = (telfragment) getFragmentManager() 69 .findFragmentByTag(telfragment.FRAGMENT_TAG); 70 if (null == fragment) { 71 fragment = new telfragment(); 72 } 73 return fragment; 74 } 75 76 private findfragment getfindFragment() { 77 findfragment fragment = (findfragment) getFragmentManager() 78 .findFragmentByTag(findfragment.FRAGMENT_TAG); 79 if (null == fragment) { 80 fragment = new findfragment(); 81 } 82 return fragment; 83 } 84 85 private mefragment getmeFragment() { 86 mefragment fragment = (mefragment) getFragmentManager() 87 .findFragmentByTag(mefragment.FRAGMENT_TAG); 88 if (null == fragment) { 89 fragment = new mefragment(); 90 } 91 return fragment; 92 } 93 94 @Override 95 public void onClick(View v) { 96 97 FragmentTransaction ft = getFragmentManager().beginTransaction(); 98 String tag = null; 99 Fragment changefragment = null;100 switch (v.getId()) {101 case R.id.tab1_layout:102 if (mweixin == null) {103 m_curtab.setSelected(false);104 m_weixintab.setSelected(true);105 m_curtab = m_weixintab;106 changefragment = this.getweixinFragment();107 tag = weixinframent.FRAGMENT_TAG;108 }109 break;110 111 case R.id.tab2_layout:112 if (mtel == null) {113 m_curtab.setSelected(false);114 m_teltab.setSelected(true);115 m_curtab = m_teltab;116 changefragment = this.gettelFragment();117 tag = telfragment.FRAGMENT_TAG;118 }119 break;120 121 case R.id.tab3_layout:122 if (mfind == null) {123 m_curtab.setSelected(false);124 m_findtab.setSelected(true);125 m_curtab = m_findtab;126 changefragment = this.getfindFragment();127 tag = findfragment.FRAGMENT_TAG;128 }129 break;130 131 case R.id.tab4_layout:132 if (mMe == null) {133 m_curtab.setSelected(false);134 m_metab.setSelected(true);135 m_curtab = m_metab;136 changefragment = this.getmeFragment();137 tag = mefragment.FRAGMENT_TAG;138 }139 break;140 }141 142 if (changefragment != null) {143 Fragment f = getFragmentManager().findFragmentByTag(tag);144 ft.hide(mCurrentfragment);145 if (null == f) {146 ft.add(R.id.content_frame, changefragment, tag);147 } else {148 ft.show(changefragment);149 }150 ft.commit();151 mCurrentfragment = changefragment;152 }153 154 }155 156 }
说明:使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction,可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作。
可以这样得到FragmentTransaction类的实例:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个transaction是一组同时执行的变化的集合。用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
运行效果:
点击发现,界面变为如下图: