简体   繁体   English

使用 android 片段后台堆栈的最佳方法是什么?

[英]What is the best way to work with android fragment backstack?

I am working with multiple fragments with only one Activity and I want to know how to manage fragment backstack on back press (the best way)我正在使用只有一个 Activity 的多个片段,我想知道如何在背压时管理片段回栈(最好的方法)

Any link or little explanation with some code can be helpful任何链接或带有一些代码的小解释都会有所帮助

All you need to make sure you call .addToBackStack(null) in Fragment Manager and Fragment Transaction您需要确保在Fragment ManagerFragment Transaction中调用.addToBackStack(null)

I'll suggest you to use Android Jetpack Navigation.我建议您使用 Android Jetpack Navigation。 A new and improved way to handle fragment transactions.一种处理片段事务的新的和改进的方法。 This is way better than the old FragmentTransaction class method.这比旧的FragmentTransaction class 方法要好得多。 It is highly recommended by Google itself.谷歌自己强烈推荐它。 And I'm also learning it nowadays.我现在也在学习它。 There's a tutorial below.下面有教程。

Android Jetpack - Navigation Android 喷气背包 - 导航

Example fragment backstack on back press:背压时的示例片段回栈:

FragmentsActivity is the activity which will be the container for all your fragments, so override FragmentsActivity's onBackPressed() like this - FragmentsActivity是将成为所有片段的容器的活动,因此像这样覆盖 FragmentsActivity 的onBackPressed() -

override fun onBackPressed() {
        val fm = supportFragmentManager
        if (fm.backStackEntryCount > 0) { //if backstack contain any fragment than pop it
            fm.popBackStack()
        } else {                          // call super function normally 
            super.onBackPressed()
        }
    }

Now whenever launch a fragment like this -现在每当启动这样的片段 -

//If you don't want it in backstack
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, FragmentA())
.commit() 

//If you want it in backstack
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, FragmentA())
.addToBackStack(null)           //null or any String TAG you want
.commit() 

Backpress on Fragments支持片段

Need your fragment to be notified when user presses back button?当用户按下后退按钮时需要通知您的片段吗?

The Dumb Way:愚蠢的方式:

MyFragment.kt我的片段.kt

requireActivity().onBackPressedDispatcher.addCallback(this,
    object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // user pressed back button
        }
    })

The Rockstar Developer Way: Rockstar 开发者之路:

Add this dependency:添加此依赖项:

https://developer.android.com/reference/kotlin/androidx/activity/OnBackPressedDispatcher.html https://developer.android.com/reference/kotlin/androidx/activity/OnBackPressedDispatcher.html

implementation 'androidx.activity:activity-ktx:1.0.0-rc01'实现 'androidx.activity:activity-ktx:1.0.0-rc01'

requireActivity().onBackPressedDispatcher.addCallback(this) {
    // user pressed back button
}

The common answer for this query is to pop the backstack or navigate up to previous activity.此查询的常见答案是弹出 backstack 或导航到上一个活动。 What if you dont want to pop the backstack on a certain fragment?如果你不想在某个片段上弹出 backstack 怎么办?

Override your onbackpressed to handle these conditions:覆盖你的 onbackpressed 来处理这些情况:

override fun onBackPressed() {

    when(supportFragmentManager.fragments[0].javaClass.simpleName){
        "FragmentOne" -> doActionOne()
        "FragmentTwo" -> doActionTwo()
        ...
        else -> supportFragmentManager.popBackStack()
    }
}

this gets your name of your current fragment and then you decide what you would want to do.这将获取您当前片段的名称,然后您决定要做什么。 For example maybe for one of the fragments you want a dialog to ask "are you sure you want to leave?"例如,您可能希望对话询问“您确定要离开吗?”的片段之一。 ect.等等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM