Fragment 切換的兩種方式

2021-07-14 13:01:25 字數 2593 閱讀 2332

我們都知道fragment切換有兩種方式:

1. replace方式

transaction.replace(r.id.content, fragment1);

2. add-hide-show方式

transaction.add(r.id.content, fragment1); transaction.hide(fragment2); transaction.show(fragment1);

來看一下使用add切換時候的生命週期:

載入fragment1

fragment1 oncreate

fragment1 oncreateview

fragment1 onstart

fragment1 onresume

用以下**切到fragment2:

fragmenttransaction ft = getfragmentmanager().begintransaction();

ft.hide(fragment1);

ft.add(r.id

.******_fragment, fragment2);

ft.settransition(fragmenttransaction.transit_fragment_open);

ft.commit();

fragment1不走任何生命週期,但會調onhiddenchanged方法

fragment2 oncreate

fragment2 oncreateview

fragment2 onstart

fragment2 onresume

回到fragment1,hide fragment2:

fragmenttransaction ft = getfragmentmanager().begintransaction();

if(!fragment1.isadd())else

ft.hide(fragment2);

ft.settransition(fragmenttransaction.transit_fragment_open);

ft.commit();

fragment1還是不走任何生命週期,調onhiddenchanged方法

fragment2 onpause

fragment2 onstop

fragment2 ondestoryview

fragment2 ondestory

用這種方法切換,fragment在隱藏時並不會走ondestoryview,所以顯示時也不會走oncreateview,所有view都一直儲存在記憶體中。

用replace方法:

載入fragment1生命週期與上面相同:

fragment1 oncreate

fragment1 oncreateview

fragment1 onstart

fragment1 onresume

切到fragment2:

fragmenttransaction ft = getfragmentmanager().begintransaction();

ft.replace(r.id

.******_fragment, fragment2);

ft.settransition(fragmenttransaction.transit_fragment_open);

ft.commit();

這次的fragment1走生命週期了

fragment1 onpause

fragment1 onstop

fragment1 ondestoryview

fragment1 ondestory

fragment2 oncreate

fragment2 oncreateview

fragment2 onstart

fragment2 onresume

可以看到,fragment1走了ondestory,被完全**了!

再切回到fragment1

fragmenttransaction ft = getfragmentmanager().begintransaction();

ft.replace(r.id

.******_fragment, fragment1);

ft.settransition(fragmenttransaction.transit_fragment_open);

ft.commit();

fragment1 oncreate

fragment1 oncreateview

fragment1 onstart

fragment1 onresume

fragment2 onpause

fragment2 onstop

fragment2 ondestoryview

fragment2 ondestory

fragment1因為已經被**,又走oncreate,fragment2被**。

Fragment 切換的兩種方式

我們都知道fragment切換有兩種方式 1.replace方式 transaction.replace r.id.content,fragment1 2.add hide show方式 transaction.add r.id.content,fragment1 transaction.hide ...

scrapy User Agent切換的兩種方法

第一種是使用在setting裡面設定middlewares。這個網上有較多版本,我覺得這個版本寫的比較好,也比較新。有的舊版本還在使用scrapy.contrib.middleware。scrapy新的版本裡已經不用contrib了,直接寫scrapy.middleware就可以了。note 另外為...

C DLL匯出的兩種方式和鏈結的兩種方式

第一種 匯出方式 extern c declspec dllexport int plus int x,int y extern c declspec dllexport int sub int x,int y extern c declspec dllexport int mul int x,in...