多個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(currentFragmentlog如下: 我們從log中可以看出,再次切換至HomeFragment時沒有呼叫onAttach和onCreate方法,說明這種方式減少了生命週期的呼叫,也算是提升了一些效能。 不過我們還有一種方式,可以完全不重新呼叫任何一個生命週期函式,add()-->hide()-->show()-->:(程式碼基本和上面一樣,只是把attach改為show,dettach改為hide)).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(); } }
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中巢狀viewpager,vierpager中有多個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中巢狀viewpager,viewpager中有多個fragment,裡面fragment沒有顯示
fragment巢狀fragment導致裡面fragment介面沒有顯示,例子如下: private void InitViewPager(View parentView) { mPag