1. 程式人生 > >多個Fragment之間的切換,該用什麼方法呢?

多個Fragment之間的切換,該用什麼方法呢?

最近在開發過程中使用Fragment做很常見的類微信介面,底部四個可選項,首頁、課程、發現和我的,每點選其中一個,在上方顯示不同的Fragment,如下圖:

起初我並沒有考慮太多,用了最簡單的方式,直接使用replace方法,程式碼如下:

getSupportFragmentManager().beginTransaction().replace(R.id.rl_main_content, fragment)
        .commit();

後來別人看我程式碼的時候,說我這樣用會重複建立Fragment介面,浪費資源,如果涉及網路請求,還會重複請求,消耗使用者流量,使用者體驗會很差。

於是,我寫了個例子打log看看在使用replace的時候,Fragment究竟走了哪些生命週期,log如下:

從log中我們可以看出,用replace的方式切換Fragment時,會把Fragment的完整生命週期走一遍,這就讓人不能忍了,我的需求是會多次在Fragment之間切換的,如果每次都重走Fragment生命週期,的確是會浪費資源,消耗流量的。

接著我又找到另一種方式,add()-->detach()-->attach():

getSupportFragmentManager().beginTransaction().detach(fragment);
getSupportFragmentManager().beginTransaction().attach(fragment);

這種方式是先呼叫add()方法並給Fragment傳入唯一的Tag,將Fragment加入它的管理類中,接著我們呼叫detach()方法,解除當前Fragment與Activity的關聯,然後用管理類的findFragmentByTag()方法通過Tag來找到我們要的Fragment,最後呼叫attach()方法將其與Activity關聯,程式碼如下:

private Fragment currentFragment;
private void replaceFragment(String tag) {
    if (currentFragment != null) {
        getSupportFragmentManager().beginTransaction().detach(currentFragment
).commit(); } currentFragment = getSupportFragmentManager().findFragmentByTag(tag); if (currentFragment == null) { switch (tag) { case "home": currentFragment = new HomeFragment(); break; case "lesson": currentFragment = new LessonFragment(); break; case "discover": currentFragment = new DiscoverFragment(); break; case "mine": currentFragment = new MineFragment(); break; } getSupportFragmentManager().beginTransaction().add(R.id.rl_main_content, currentFragment, tag).commit(); }else { getSupportFragmentManager().beginTransaction().attach(currentFragment).commit(); } }
log如下: 我們從log中可以看出,再次切換至HomeFragment時沒有呼叫onAttach和onCreate方法,說明這種方式減少了生命週期的呼叫,也算是提升了一些效能。 不過我們還有一種方式,可以完全不重新呼叫任何一個生命週期函式,add()-->hide()-->show()-->:(程式碼基本和上面一樣,只是把attach改為show,dettach改為hide)
private void replaceFragment(String tag) {
    if (currentFragment != null) {
        getSupportFragmentManager().beginTransaction().hide(currentFragment).commit();
}
    currentFragment = getSupportFragmentManager().findFragmentByTag(tag);
    if (currentFragment == null) {
        switch (tag) {
            case "home":
                currentFragment = new HomeFragment();
                break;
            case "lesson":
                currentFragment = new LessonFragment();
                break;
            case "discover":
                currentFragment = new DiscoverFragment();
                break;
            case "mine":
                currentFragment = new MineFragment();
                break;
}
        getSupportFragmentManager().beginTransaction().add(R.id.rl_main_content, currentFragment, tag).commit();
}else {
        getSupportFragmentManager().beginTransaction().show(currentFragment).commit();
}
}

相關推薦

Fragment之間切換什麼方法

最近在開發過程中使用Fragment做很常見的類微信介面,底部四個可選項,首頁、課程、發現和我的,每點選其中一個,在上方顯示不同的Fragment,如下圖: 起初我並沒有考慮太多,用了最簡單的方式,直接使用replace方法,程式碼如下: getSupportFragm

shell控制hql執行如何控制階段之間序列階段內部並行

上週組裡同學給了一個數據任務: 1.在hive上傳汽車詞包 2.根據汽車詞包圈出指定時間段內的cookie 3.根據cookie找出這些使用者的所有搜尋記錄 4.從所有搜尋資料中找到含有明星的搜尋記錄 5.根據每個明星group by,計數 我的解決辦法如下:

Android入門 Activity之間切換原理介紹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Python + Appium 【已解決】driver(session)在class之間執行完一個類的再次執行下類的例時不需要初始化

nic bject config com appium client lee session ted py文件的名稱為:appium_config.py 中的寫法如下 # coding=UTF-8 ‘‘‘ Created on 2017.1.13 @author: Lu

CDockablePane 合併後程式碼控制切換Tab

多個CDockablePane合併後會生成N多個Tab頁,以前都是用滑鼠點選Tab頁來切換Tab,現在專案上某個功能需要用程式碼來控制切換Tab,百度找了很久終於找到一個方法,現在分享出來: CWnd * pParent = m_CameraPane.GetParent();  &n

關於Fragment切換退出整個應用(APP)後第二次開啟應用的報錯解決

第二次開啟APP的時候,fragment事物的.commit()或者 在退出整個應用的那個Activity,如HomeActivity的重寫回退事件onBackPressed()裡面寫上android.os.Process.killProcess(android.os.

C#程序調cmd.exe執行其他exe進程(並且含參數)並把進程結果返回給字符串

() stat syntax || 錯誤 void dia clas ring 1.關鍵代碼部分。 using System.Diagnostics; public class CmdHelper {

Selenium2+python自動化71-瀏覽器之間切換【轉載】

logs ant utf-8 動態 不同的 ova data- 目的 有時 前言 有時候一些業務的功能涉及到多個系統,需要在web系統1打開造一些數據,然後用到某些參數是動態生成的,需要調用web系統2裏面的參數。 舉個簡單例子:在做某些業務的時候,需要手機短信驗證碼,

56、彈出框和視窗之間切換

學習目標: 1、掌握使用Swing實現彈出框功能 2、使用Swing切換視窗 3、新視窗的定義和彈出   學習過程: 一、彈出框 1、簡介 Java 中的對話方塊是一個容器,它充當父容器的子容器  Swing中的彈出式對話方塊是用JOptionPa

Python指令碼自動運營自媒體平臺不寫稿坐等收錢只告訴你原理

使用此方法最低成本不超過120元/年,年收入根據你所選擇垂直行業和帳號多少以及哪些平臺來決定 我所說的最低成本是針對我而言來說的,辛苦點的可以做到0成本操作,喜歡冒險的總投入不會超過5000塊錢 首先第一步就是你要有自媒體帳號,帳號和平臺不限,根據你對平臺的理解來自行選擇使用那個平臺,

一個Activity中Fragment個別fragment實現沉浸式狀態列

                如上圖,同一個activity(NoActionBar)有多個fragment的情況下,只有"我的"模組需要設定為沉浸式的狀態列,而其他fragmen

Fragment 切換時不重新例項化

在專案中需要進行Fragment的切換,一直都是用replace()方法來替換Fragment: 1 2 3 4 5 6 7 8 9 public void s

在node中介軟體(微服務)架構中一個node去部署專案比較好還是一個專案對應一個node比較好?

第一種: 一個專案對應一個node服務; 優點:前端跟node也是可以獨立開發,降低耦合,也可單獨部署; 缺點:一個專案對應一個node,專案多的話,維護不方便; 第二種:一個node下,部署多個專案,可以以這個node作為底盤,在點選進入專案時,讓其載入該專案

涉及Fragment點選其中一個fragment中的“點選登入”按鈕跳轉到“登入”介面時出現程式閃退現象

問題說明:我想實現從當前fragment_me中點選一下登入按鈕,跳轉到登入介面,所以我在MeFragment.java裡的onCreate()方法中為TextView控制元件新增監聽事件。但在實際執行中,我點選“Me”之後,會出現閃退現象。 錯誤:空指標異常 出現閃

vue component :is實現元件之間切換

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue Component 標籤</title> <

Codeforces Round #478 (Div. 2) D Ghosts 會超時的判斷兩之間關係可以map

給出起始座標(x,y)要充分利用題目條件,最好全都列出來運動方向(Vx,Vy)很容易得到判斷兩個是否相碰(gho[a].y-gho[b].y)*1.0/(gho[a].vy-gho[b].vy)==(gho[a].x-gho[b].x)*1.0/(gho[a].vx-gho[

fragment中巢狀viewpagervierpager中有fragment不顯示 ...

現在好多應用流行一種佈局。底部幾個工具欄選項,上面也有類似tab的選項。 底部用RadioGroup控制fragment的切換。以上有五個fragment。 第一個fragment,代表著首頁。首頁又是一個類似tab的fragment,使用viewpager切換著兩

Activity之間傳值使用Intent

感覺已經好久都沒有寫部落格了,今天來更新一篇,雖然是很零碎的知識點,但也是好不容易才擠出時間來寫的,僅供參考,大神就不要吐槽了,好了廢話就不多說了 Activity之間傳值有很多種,當然看寫程式碼的人比較趨向於哪一種了,無論用那種方式實現的目的只有一個:多個Activity

jdk之間如何切換

我相信大多數人應該跟我一樣曾遇到這樣的問題 電腦裡裝了兩個版本以上的jdk 比如我的電腦裡安裝了1.6版本的和1.7版本的, 執行指令檢視jdk版本java -version,顯示當前系統的預設jdk是1.7的,但是由於專案需要我需要切換到1.6的版本 我該如何切換呢? 如

fragment中巢狀viewpagerviewpager中有fragment裡面fragment沒有顯示

fragment巢狀fragment導致裡面fragment介面沒有顯示,例子如下: private void InitViewPager(View parentView) { mPag