kotlin android onBackPressedDispatcher未运行

t40tm48m  于 2023-10-23  发布在  Kotlin
关注(0)|答案(2)|浏览(163)

我想提供自定义返回导航
我在Fragment中的onCreate上有这样的代码:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
        setHasOptionsMenu(true)

        requireActivity().onBackPressedDispatcher.addCallback(
            this,
            object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    Log.e("onCreate:", "back pressed invoked")
                }
            }
        )
        Log.e("onCreate: ", "Run")
    }

片段声明:

class InsertFragment : Fragment() {

}

i使用导航组件,我的库版本是:

def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version"
implementation 'androidx.appcompat:appcompat:1.1.0'

当我点击后退按钮,我没有输出Log,我错过了什么?

vc6uscn9

vc6uscn91#

onBackPressedDispatcher用于手柄设备返回按钮。
因此,Log仅在按下设备后退按钮时运行

qncylg1j

qncylg1j2#

我不知道
如果你使用导航组件,应该看看这个
不要这样做:

activity?.onBackPressedDispatcher?.addCallback(
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                //todo
            }
        }
)

请改为执行以下操作:

activity?.onBackPressedDispatcher?.addCallback(
        viewLifecycleOwner,
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                //todo
            }
        }
 )

为什么我们在callback中使用viewLifecycleOwner,因为在导航到下一个片段后,backpress函数将被清除。如果你不使用它,整个容器活动backpresss函数将被触发,并影响到该容器活动中的其他片段。

相关问题