在没有娱乐的片段之间移动 - Kotlin
Posted
技术标签:
【中文标题】在没有娱乐的片段之间移动 - Kotlin【英文标题】:Move between fragments without recreation- Kotlin 【发布时间】:2019-10-05 19:04:38 【问题描述】:我试图在两个 fragments
之间移动而不重新创建它们,因此前一个片段中的数据不会消失。
我试图在互联网上寻找答案并尝试了几个小时但没有成功。我查看了这些链接:
link 1 link 2 link 3- android developer site在show()
和hide()
之后,我也尝试了AddToBackStack()
,但没有成功
class MainActivity : AppCompatActivity()
private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener item ->
@Override
when (item.itemId)
R.id.navigation_home ->
//replaceFragment(SignInFragment())
supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()
supportFragmentManager.beginTransaction().show(SignInFragment()).commit()
return@OnNavigationItemSelectedListener true
R.id.navigation_events ->
//replaceFragment(AllEventsFragment())
supportFragmentManager.beginTransaction().hide(SignInFragment()).commit()
supportFragmentManager.beginTransaction().show(AllEventsFragment()).commit()
if (currentUser.isNotEmpty())
updateRecyclerView()
sign_in_error?.visibility = View.INVISIBLE
return@OnNavigationItemSelectedListener true
return@OnNavigationItemSelectedListener false
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction().add(R.id.activity_main, AllEventsFragment(), "2").commit()
supportFragmentManager.beginTransaction().add(R.id.activity_main, SignInFragment(), "1").commit()
val navView: BottomNavigationView = findViewById(R.id.nav_view)
navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
personInEvent = false
结果是重叠的片段没有真正在它们之间导航的选项。我真的尝试了所有我知道的东西,互联网上有一些答案,但没有一个能帮助我解决我的问题。对于这个令人沮丧的问题,我非常感谢您的帮助。
导航前:
导航后:
【问题讨论】:
【参考方案1】:supportFragmentManager.beginTransaction().hide(AllEventsFragment()).commit()
您每次都在重新创建片段!
调用AllEventsFragment()
等同于new AllEventsFragment()
你需要先实例化它们 例如, 你的代码需要是这样的,
val fragment1: Fragment = SignInFragment()
val fragment2: Fragment = AllEventsFragment()
var active = fragment1
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction().add(R.id.activity_main,fragment2 , "2").commit()
supportFragmentManager.beginTransaction().add(R.id.activity_main, fragment1, "1").commit()
val navView: BottomNavigationView = findViewById(R.id.nav_view)
navView.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
personInEvent = false
在你的听众中
R.id.navigation_home ->
supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment1).commit();
active = fragment1;
return@OnNavigationItemSelectedListener true
R.id.navigation_events ->
//replaceFragment(AllEventsFragment())
supportFragmentManager.beginTransaction().beginTransaction().hide(active).show(fragment2).commit();
active = fragment2
)
//handle rest of the cases
【讨论】:
我发誓我试过这个 LOL,但现在它可以工作了,所以我没有抱怨,非常感谢!【参考方案2】:看看架构组件,你也可以用旧的方式实现Android - save/restore fragment state 当一个片段不可见时,它会暂停甚至可能被破坏,使用捆绑包来保存数据。 你想要达到的目标可以使用两个容器来完成,但你真的不应该
【讨论】:
以上是关于在没有娱乐的片段之间移动 - Kotlin的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 如何在eclipse中的工作区之间移动片段