androidfragment返回
1. android 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的子類(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代碼看起來和Activity的類似。
每當創建一個Fragment時,首先添加以下三個回調方法:
onCreate():系統在創建Fragment的時候調用這個方法,這里應該初始化相關的組件,一些即便是被暫停或者被停止時依然需要保留的東西。 onCreateView():當第一次繪制Fragment的UI時系統調用這個方法,該方法將返回一個View,如果Fragment不提供UI也可以返回null。注意,如果繼承自ListFragment,onCreateView()默認的實現會返回一個ListView,所以不用自己實現。 onPause():當用戶離開Fragment時第一個調用這個方法,需要提交一些變化,因為用戶很可能不再返回來。
將Fragment載入到Activity當中有兩種方式:
方式一:添加Fragment到Activity的布局文件當中 方式二:在Activity的代碼中動態添加Fragment(薦)
第一種方式雖然簡單但靈活性不夠。添加Fragment到Activity的布局文件當中,就等同於將Fragment及其視圖與activity的視圖綁定在一起,且在activity的生命周期過程中,無法切換fragment視圖。
第二種方式比較復雜,但也是唯一一種可以在運行時控制fragment的方式(載入、移除、替換)。
2. android 怎麼返回棧頂的fragment
我在上一個app的做法是先創建所有的fragment的示例,當需要顯示那個fragment就從集合總拿出來顯示就可以了。
3. Android——Fragment
Fragment必須總是被嵌入到一個activity之中,並且fragment的生命周期直接接受其宿主activity的生命周期的影響。你可以認為fragment是activity的一個模塊零件,它有自己的生命周期,接收它自己的輸入的事件,並且可以在activity運行時添加或者刪除。
應該將每一個fragment設計為模塊化和可復用化的activity組件。也就是說,你可以在多個activity中引用同一個fragment,因為fragment定義了它自己的布局,並且使用它本身生命周期回調的行為。
Fragment比Activity多了幾個額外的生命周期回調方法:
管理fragment生命周期與管理activity生命周期很相像,像activity一樣,fragment也有三種狀態:
1、Resumed:
fragment在運行中的activity中可見。
2、Paused:
另一個activity處於前台且得到焦點,但是這個fragment所在的activtiy仍然可見(前台activity部分透明,或者沒有覆蓋全屏)。
3、Stopped:
fragment不可見。要麼宿主activity已經停止,要麼fragment已經從activity上移除,但已被添加到後台棧中。一個停止的fragment仍然活著(所有的狀態和成員信息仍然由系統保留著)。但是,它對於用戶來講已經不再可見,並且如果activity被殺掉,它也將被殺掉。
如果activity的進程被殺掉了,在activity被重新創建時,你恢復fragment狀態。可以執行fragment的onSaveIntanceState()來保存狀態(注意:fragment是在onCreate(),onCreateView()或者onActivityCreate()中進行恢復)。
在生命周期方面,activity和fragment之間一個很重要的不同就是在各自的後台棧中是如何存儲的。當activity停止時,默認情況下activity被安置在由系統管理的activity後台棧中;fragment僅當在一個事務被移除時,通過顯式調用addToBackStack()請求保存的實例,該fragment才被置於由宿主activity管理的後台棧。
類似與Android系統為Activity維護一個任務棧,我們也可以通過Activity維護一個回退棧來保存每次Fragment事務發生的變化。
如果你將Fragment任務添加到回退棧,當用戶點擊後退按鈕時,將看到上一次的保存的Fragment。一旦Fragment完全從後退棧中彈出,用戶再次點擊後退鍵,則退出當前Activity。
通過Arguments創建Fragment,不建議通過為Fragment添加帶參數的構造函數
1、FragmentPagerAdapter:對於不再需要的fragment,選擇調用detach方法,僅銷毀視圖,並不會銷毀fragment實例。
2、FragmentStatePagerAdapter:會銷毀不再需要的fragment,當當前事務提交以後,會徹底的將fragment從當前Activity的FragmentManager中移除。
3、懶載入,核心方法是 setUserVisibleHint()
原因1:橫豎屏切換,造成Fragment重新實例化。
原因2:按下Home鍵,Activity處於後台,由於內存不足被銷毀,重新喚醒時Fragment重新實例化。
註:出現的原因是在 API24 之前的 v4包 的源碼問題,
解決方案:通過檢查onCreate的參數Bundle savedInstanceState就可以判斷,當前是否發生Activity的重新創建:
默認的savedInstanceState會存儲一些數據,只有在savedInstanceState==null時,才進行創建Fragment實例:
4. WebView在Fragment中點擊返回鍵返回上一頁
在大多數情況下,在Activity中實現WebView點擊返回鍵返回上一頁是經常遇到的事情,並且很容易解決,如下:
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">//無滾動條
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
WebView webView = (WebView)findViewById(R.id.webView);
}
@Override
booleanonKeyDown(intkeyCode,KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK&&webView.canGoBack()) {
webView.goBack();
return true;
}else{
//結束當前頁
return super.onKeyDown(keyCode,event);
}
}
那麼在Fragment中,我們是如何進行webview點擊返回鍵時返回上一級呢?
如下:
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">
@Override
publicViewonCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_webview,container, false);
WebView webView = (WebView)view.findViewById(R.id.webView);
webView.setOnKeyListener(newView.OnKeyListener() {
@Override
public booleanonKey(View view, intkeyCode,KeyEvent keyEvent) {
if((keyCode == KeyEvent.KEYCODE_BACK) &&webView.canGoBack()) {
getActivity().runOnUiThread(newRunnable() {
@Override
public voidrun() {
webView.goBack();
}
});
return true;
}
return false;
}
});
returnview;
}
5. Android組件之Fragment(一)---基礎知識與運用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然後進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀!
引用官方的一張圖片,其實已經說明問題了,就是為了更好的適配大屏,在大屏的時候,不需要去在一個activity內部通過復雜的布局和界面去實現,只需要去在一個activity內部,通過多個fragment來做界面布局實現即可,而且針對於多個fragment來說, 每個fragment有單獨的生命周期,
Demo樣例,我們在一個界面中,有上下兩個fragment,如圖所示:
Step 2: Fragment創建,視圖載入,數據賦值
BlankFragment .java
Step 3: Activity在onCreate( )方法中調用setContentView()之後調用FragmentTransaction 進行事務提交
FragmentTestActivity.java
在xml中聲明兩個fragment,指定為具體的fragment
Step 1:定義Fragment的布局,就是fragment顯示內容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法載入Fragment的布局文件,接著返回載入的view對象
BlankFragment.java
Step 3:在需要載入Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中調用setContentView()載入布局文件即可!
針對在一個Activity中的某個Layout中切換Fragment,,無非兩種方法:
我們自己看一下方法注釋
源碼方法注釋裡面說的很明白,這個方法會移除所有的fragment,然後添加當前的fragment。
這時分為兩種情況,一種是fragment已有並且在前台展示,一種是未有或者在後台,針對於前者,此時replace,生命周期不會發生變化,針對後者,生命周期會重新走
分為兩種情況,一種fragment已存在,一種未存在,針對於前者,生命周期無變化,但是會回調onHiddenChanged方法,針對於後者,生命周期會創建一次。
1.Fragment是Google官方引入的一個為了適配大屏、多頁面的一個組件。您可以理解為它就是一個類而已,只不過裡麵包含了View,並且與activity的生命周期進行了關聯。
2.動態載入與靜態載入相對來說,建議使用動態載入,靜態載入固定在了xml文件中,永遠不變。
3.replace的fragment如果不在前台,會執行所有生命周期,反之不會執行任何生命周期方法;hide+show生命周期並不會發生變化,但是會回調onHiddenChanged方法,在實際開發中,建議add之後,使用hide+show來操作fragment,一方面減少資源的重復載入和創建,另外一方面提升用戶體驗感。
4.fragment的生命周期大體上和activity一致,但是前期和後期多了一些東西,因為fragment內部有view,那麼這個view需要進行創建、然後添加到activity內部,所以相應的在onCreate與onStart之間就多了幾個方法-onCreateView、onViewCreated。相同的道理,fragment的view與activity解綁,也相應的在onStop與onDestory之間多個方法-onDestroyView。onAttach與onDetach可以理解為視圖與activity產生關聯和接觸關聯,是最開始和最後的步驟。
Demo地址