今天開發(fā)app的時(shí)候信夫,又碰到了一個(gè)我疑惑了很久的問題:fragment碎片動(dòng)態(tài)切換怎么切換窃蹋,正常的replace , addBackStack 這幾個(gè)會(huì)出現(xiàn)一些bug ,比如說静稻,你如果沒有將 主頁的fragment添加到棧中警没, 那你點(diǎn)到另一個(gè)fragment后會(huì)丟失當(dāng)前你在主頁的一些數(shù)據(jù),比如輸入框內(nèi)容
要想解決這個(gè)問題振湾,就得使用 addToBackStack()方法杀迹,添加到棧中去,不過這樣做了當(dāng)你重復(fù)點(diǎn)擊首頁的話會(huì)重復(fù)創(chuàng)建界面押搪,并且树酪,當(dāng)你點(diǎn)擊返回鍵,會(huì)返回到上一個(gè)fragment大州,很讓人頭疼续语,所以我花了個(gè)流程圖,解決了這幾個(gè)問題厦画,概括了一下疮茄,具體還是看我的代碼
用文字表述一下:
首先,定義兩個(gè)變量 苛白, 添加的fragment 娃豹, 此時(shí)頂層的 targetFragment
然后焚虱,定義一個(gè)changeFragment()方法 购裙,傳入?yún)?shù)為:fragment
接下來方法中第一步: 判斷target是否初始化,若沒有初始化鹃栽,說明是第一次給界面添加碎片執(zhí)行代碼
fun changeFragment(fragment : Fragment){
val ft = supportFragmentManager.begainTransaction()
if(this::targetFragment . isInitialize){
ft.add( "這里填你的fragmetn容器的 id ", fragment )
.addToBackStack("")
.commit()
//然后將 target賦值 躏率,表示頂層的fragmetn就是這個(gè)
targetFragment = fragment
}
}
``
###上面就是第一次定義的代碼
那么如果此時(shí)容器中已經(jīng)有 fragment了, 那么該怎么去顯示民鼓?薇芝?
//判斷是否存在于棧中,是否已經(jīng)被添加
if(fragment.isAdded){
if(fragment != targetFragment ){
ft.hide(targetFragment)
.show(fragment)
.commit()
}
}else{
//如果沒有被添加丰嘉,那么就
ft.add("fragment容器的id" , fragment)
.hide(targetFragment)
.commit()
}
//最后一步夯到,別忘了給 targetFragment賦值
targetFragment = fragment
在activity中,如果你像我一樣添加了這些fragment饮亏, 并且添加到了棧中耍贾,返回一下會(huì)導(dǎo)致返回上一個(gè)加載的fragment
所以重寫一個(gè)方法-----onBackPress(){
//只需要將super.onBackPress()去掉就可以了
//并且添加上一行
finish() //可以改根據(jù)自己需要去操作阅爽,比如點(diǎn)擊兩下退出程序...
}
因?yàn)楸容^忙,所以這篇寫的有點(diǎn)倉促荐开,希望能幫助到被fragment動(dòng)態(tài)切換困惑的你付翁,謝謝觀看、最后貼上方法晃听,
fun changeFragment(fragment : Fragment){
val bt = supportFragmentManager.beginTransaction()
if( ! this::targetFragment.isInitialized ){
//如果target還沒有初始化百侧,那么說明是第一次添加
bt.add(R.id.fragment_container_main , fragment).commit()
targetFragment = fragment //并且將添加的設(shè)置為頂層的fragment
return
}
//如果這個(gè)fragment已經(jīng)
if(fragment.isAdded){
if(fragment != targetFragment){
bt.hide(targetFragment).show(fragment).commit()
}
}else{
bt.add(R.id.fragment_container_main , fragment)
.addToBackStack("main")
.hide(targetFragment)
.commit()
}
//最后一步就是將target指定為
targetFragment = fragment
}
override fun onBackPressed() {
//將super.()去掉就可以禁止返回了
ToastUtil.show("禁止返回了!")
//但是可以退出能扒!
}
``