宁愿跑起来被拌倒无数次,也不愿规规矩矩走一辈子。就算跌倒也要豪迈的笑。
本讲内容:Fragment的使用
一、Fragment的生命周期
Fragment和活动一样一共有运行状态、暂停状态、停止状态、和销毁状态这四种。
Fragment比Activity多了几个额外的生命周期回调方法:
onAttach() 、onCreateView() 、onActivityCreated()、onDestoryView()、onDetach()
示例一:(在上一讲基础下修改)
修改RightFragment中的代码
public class RightFragment extends Fragment { private static final String TAG = "MainActivity"; /** * 当Fragment被添加到Activity时候会回调这个方法,并且只调用一次 */ public void onAttach(Activity activity) { super.onAttach(activity); Log.d(TAG, "onAttach"); } /** * 创建Fragment时会回调,只会调用一次 */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); } /** * 碎片创建视图(加载布局)时调用 */ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); // 通过LayoutInflater的inflate()方法将定义的布局动态加载进来 View view = inflater.inflate(R.layout.right_fragment, container, false); return view; } /** * 当Fragment所在的Activty启动完成后调用(当Activity的onCreate方法返回时调用) */ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated"); } /** * 启动Fragment调用 */ public void onStart() { super.onStart(); Log.d(TAG, "onStart"); } /** * 恢复Fragment时会被回调,调用onStart()方法后面一定会调用onResume()方法 */ public void onResume() { super.onResume(); Log.d(TAG, "onResume"); } /** * 暂停Fragment调用 */ public void onPause() { super.onPause(); Log.d(TAG, "onPause"); } /** * 停止Fragment调用 */ public void onStop() { super.onStop(); Log.d(TAG, "onStop"); } /** * 销毁Fragment所包含的View组件时调用 */ public void onDestroyView() { super.onDestroyView(); Log.d(TAG, "onDestroyView"); } /** * 销毁Fragment时会被回调 */ public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } /** * Fragment从Activity中删除时会回调该方法,并且这个方法只会调用一次 */ public void onDetach() { super.onDetach(); Log.d(TAG, "onDetach"); } }
</pre><pre class="java" name="code">
运行程序
可以看到当RightFragment第一次被加载到屏幕上时,会依次执行上面方法。然后点击LeftFragment中的按钮
由于AnotherRightFragment替换了RightFragment,此时的RightFragment进入了停止状态,因此会依次执行上面三个方法。当然如果在替换时没有调用addToBackStack()方法,此时RightFragment就会进入销毁状态,onDestroy()和
onDetach()方法就会执行。接着按下Back键,RightFragment会重新回到屏幕。
由于RightFragment重新回到运行状态,因此上面三个方法会依次执行,注意此时onCreate()和onCreateView()方法并不会执行,因为我们借助了addToBackStack()方法使得RightFragment和它的视图并没有销毁。再按下Back键
会依次执行上面的方法,最终将活动和碎片一起销毁。
注意:在碎片中也可以通过onSaveInstanceState()方法来保存数据的,因为进入停止状态的碎片有可能在系统内存不足的时候被回收,保存下来的数据在onCreate()、onCreateView()、和onActivityCreated()这三个方法中都可以重新得到,它们都有一个Bundle类型的onSaveInstanceState参数。
示例二:使用限定符(待续。。。)
怎样才能在运行时判断程序应该是使用双页模式还是单页模式,这就需要借助限定符来实现了。