国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Fragment涉及的add、remove和replace方法和回退棧的關系詳解

2019-11-09 16:36:20
字體:
來源:轉載
供稿:網友
在現在的Android開發中,Fragment屬于比較常用的了,在使用Fragment過程中,add、remove和replace這三個方法是比較常用的,也是容易引發歧異的,再加入回退棧的功能就更亂了,那么本文就從實踐的角度來說一說這其中的關系。在開發中,常用的做法是在Activity的布局中放一個FrameLayout,然后以這個FrameLayout為容器,把Fragment當成View(可以把Fragment理解為一個控件或者一個布局)進行切換。我們以此為基礎,那么add方法的意思是把一個Fragment加入到這個FrameLayout中,如果連續執行add方法,按照FrameLayout的特性,就相當于在FrameLayout中一層一層的疊View,下面我們來看代碼:[java] view plain copy@Override PRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.layout = (FrameLayout) this.findViewById(R.id.content); int i = 0; while (i < 10) { FragmentManager fm = this.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.content, new OneFragment()); ft.commit(); i++; } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("當前含有" + this.layout.getChildCount()); } 在代碼中的onCreate方法里執行10次往Activity中的FrameLayout添加Fragment,最后打印一下這個FrameLayout中有多少Child:[java] view plain copy07-22 00:32:02.648: I/System.out(10480): 當前含有10 由此可見,在這個場景下,add方法就相當于把Fragment層疊的放進FrameLayout中。remove方法和add方法是相對的,add是一層一層往上放,remove就是從頂上一層一層的往下拿,這里就不再贅述了。再說replace方法,還是在我們這個FrameLayout的場景中,replace相當于執行了remove和add,會remove相同id的所有Fragment,然后再把這個Fragment放進去,下面來看代碼:[java] view plain copy@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.layout = (FrameLayout) this.findViewById(R.id.content); int i = 0; while (i < 10) { FragmentManager fm = this.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content, new OneFragment()); ft.commit(); i++; } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("當前含有" + this.layout.getChildCount()); } 在代碼中的onCreate方法里執行10次replace Fragment的操作,最后打印一下這個FrameLayout中有多少Child:[java] view plain copy07-22 00:32:02.648: I/System.out(10480): 當前含有1 由此可見,雖然執行了10次,但是只會有一個Fragment在FrameLayout中。說完了這個三個方法,再說回退棧的問題。類似于Activity的棧,我們也可以通過用Activity來維護一個Fragment的棧,如果將Fragment加入到回退棧中,那么每次按回退按鈕,就會看到上次的Fragment。說到這里,有一個非常重要的概念,就是add、remove和replace方法和回退棧基本沒有關系。這里有一個點非常容易混淆,就是因為add也是一層一層的往FrameLayout里添加Fragment,那么在按回退按鈕的時候是不是一層一層的再拿出來呢?筆者這里告訴大家,根本不會,除非加入了回退棧。因為add、remove和replace只是相當于在這個界面層次上做操作,和回退棧沒有關系,即使在某些地方看起來很像(回退棧是一個一個的添加進去,按回退的時候會一個一個彈出來)。那么通過add添加Fragment之后加入回退棧,和通過replace替換Fragment之后加入回退棧有什么不一樣呢?這點就要參照在界面的關系了,add是一層一層往上疊,如果你在其中一層上做了修改,等回退到這一層時,所做的操作會被保留,并且回退的時候會一層一層把Fragment往外拿。replace實際上是替換掉了,那么雖然加入了回退棧,但是會執行銷毀視圖的方法onDestroyView,回退時會重新執行onCreateView方法重建視圖。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永年县| 驻马店市| 浦江县| 介休市| 双牌县| 余姚市| 钟祥市| 泗阳县| 鹤峰县| 闻喜县| 临江市| 安泽县| 贵德县| 麻江县| 封开县| 武强县| 荥经县| 舟山市| 昌宁县| 古交市| 大田县| 乐山市| 普洱| 泰顺县| 新乡县| 丰顺县| 北流市| 宾阳县| 兖州市| 宝兴县| 康乐县| 富川| 伊春市| 古交市| 文成县| 汤阴县| 黎川县| 潞西市| 新巴尔虎右旗| 黔西| 长阳|