編輯:關於Android編程
和活動一樣,Fragment也有生命周期。
官方文檔中有詳細的文字說明,不過最好還是實踐下,熟悉過程。
Android.com/guide/components/fragments.html">http://developer.Android.com/guide/components/fragments.html
1、Activity生命周期圖:
2、Fragment生命周期圖:
3、二者對比圖
上圖(左邊:Activity,右邊:Fragment)可見:Activity和Fragment的生命周期回調方法一一對應。
4、碎片的狀態和回調
1. 運行狀態
當一個碎片是可見的,並且它所關聯的活動正處於運行狀態時,該碎片也處於運行狀態。
2. 暫停狀態
當一個活動進入暫停狀態時(由於另一個未占滿屏幕的活動被添加到了棧頂),與它相關聯的可見碎片就會進入到暫停狀態。
3. 停止狀態
當一個活動進入停止狀態時,與它相關聯的碎片就會進入到停止狀態。或者通過調用 FragmentTransaction 的 remove()、 replace()方法將碎片從活動中移除,但有在事務提交之前調用 addToBackStack()方法,這時的碎片也會進入到停止狀態。總的來說,進入停止狀態的碎片對用戶來說是完全不可見的,有可能會被系統回收。
4. 銷毀狀態
碎片總是依附於活動而存在的,因此當活動被銷毀時,與它相關聯的碎片就會進入到銷毀狀態。或者通過調用 FragmentTransaction 的remove()、 replace()方法將碎片從活動中移除,但在事務提交之前並沒有調用 addToBackStack()方法,這時的碎片也會進入到銷毀狀態。
Fragment 類中也提供了一系列的回調方法,以覆蓋碎片生命周期的每個環節。其中, 活動中有的回調方法,碎片中幾乎都有,不過碎片還提供了一些附加的回調方法,那我們就重點來看下這幾個回調。
1. onAttach()
當碎片和活動建立關聯的時候調用。
2. onCreateView()
為碎片創建視圖( 加載布局)時調用。
3. onActivityCreated()
確保與碎片相關聯的活動一定已經創建完畢的時候調用。
4. onDestroyView()
當與碎片關聯的視圖被移除的時候調用。
5. onDetach()
當碎片和活動解除關聯的時候調用。
6.onStop()
和activity一致,fragment不可見時調用, 可能情況:activity被stopped了 或者 fragment被移除加入到回退棧中,一個stopped的fragment仍然是活著的如果長時間不用也會被移除
5、體驗活動的生命周期
代碼:
創建一個Fragmentone布局:
創建一個fragmentTwo布局:
將FragmentOne加入主布局activity_main中:
import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FragmentOne extends Fragment { public static final String TAG = "FragmentOne"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); } @Override public void onAttach(Context context) { super.onAttach(context); Log.d(TAG,"onAttach"); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG,"onCreateView"); View view = inflater.inflate(R.layout.fragment_one,container,false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG,"onActivityCreated"); } @Override public void onStart() { super.onStart(); Log.d(TAG,"onStart"); } @Override public void onResume() { super.onResume(); Log.d(TAG,"onResume"); } @Override public void onPause() { super.onPause(); Log.d(TAG,"onPause"); } @Override public void onStop() { super.onStop(); Log.d(TAG,"onStop"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG,"onDestroyView"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy"); } @Override public void onDetach() { super.onDetach(); Log.d(TAG,"onDetach"); } }
創建fragmentTwo類繼承自Fragment類:
import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Created by YQ950209 on 2016/10/15. */ public class fragmentTwo extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_two,container,false); return view; } }
主活動,通過button動態添加fragmentTwo:
package com.turo.fragmenttest; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn: fragmentTwo fragment = new fragmentTwo(); android.app.FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.two_layout,fragment); transaction.addToBackStack(null); transaction.commit(); break; default: break; } } }
運行程序,打印信息:
當 FragmentOne 第一次被加載到屏幕上時,會依次執行 onAttach()、
onCreate()、 onCreateView()、 onActivityCreated()、 onStart()和 onResume()方法。
點擊button切換到FragmentTwo,不加addToBackStack()方法:
可見,如果在替換的時候沒有調用 addToBackStack()方法,此時的 RightFragment 就會進入銷毀狀態, onDestroy()和onDetach()方法就會得到執行。
點擊button,加上addToBackStack()方法:
addToBackStack,顧名思義就是加入返回棧的意思,這裡的意思就是我們在切換時會把FragmentOne加入到返回棧,此時的FragmentOne處於停止狀態,不至於銷毀。
點擊back鍵返回FragmentOne:
由於FragmentOne重新回到了運行狀態,因此 onActivityCreated()、onStart()和 onResume()方法會得到執行。注意此時 onCreate()和 onCreateView()方法並不會執行,因為我們借助了addToBackStack()方法使得 FragmentOne 和它的視圖並沒有銷毀。
再次點擊back鍵退出程序:
沒什麼好說的,退出程序依次會執行 onPause()、onStop()、onDestroyView()、 onDestroy()和 onDetach()方法,最終將活動和碎片一起銷毀。看到這裡不知大家是否對Fragment生命周期有更深刻的理解,如果還是模糊,強烈建議結合圖三——Activity和Fragment生命周期對比圖,再次閱讀!
寫在後面
樓主是一個應屆畢業生,不是什麼大牛,寫博客只是為了鞏固自己所學的基礎,不喜勿噴,如若有錯誤,歡迎各位讀者指出,萬分感謝!
1、概述Binder能干什麼?Binder可以提供系統中任何程序都可以訪問的全局服務。這個功能當然是任何系統都應該提供的,下面我們簡單看一下Android的Binder的
1. 網頁源碼查看器網頁源碼查看器案例實現在EditText中輸入網址,點擊按鈕獲取,獲取到網頁源碼,顯示在TextView上。在IE浏覽器中,快捷鍵Shift+F12可
不少玩家會想到將圖片拷貝到電腦中,然後用PS等工具去標注編輯加工,然在再發送到朋友圈或社交平台。那麼,轉來轉去,是不是也不太方便呢?其實Android手機也
今天和大家分享的是關於在Android中設置壁紙的方法,在Android中設置壁紙的方法有三種,分別是:1、使用WallpaperManager的setResource(