如何重新附加片段(片段未附加到活动 Kotlin)

时间:2021-06-17 13:29:12

标签: android kotlin android-fragments android-activity

我对这个错误感到沮丧 Fragment not attach to an Activity,我有一个 Fragment 启动了一个 Activity,而 Activity 启动了另一个 Activity,依此类推 F -> A1 -> A2 -> A3,在我完成最后一个 { {1}} 我打电话返回托管活动

A3

但是当我设置 val intent = Intent(applicationContext, TabbarActivity::class.java) intent.putExtra("finish", "true") intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) finish() 时,它会将我的片段从 Activity 中分离出来,然后我收到此错误 Intent.FLAG_ACTIVITY_CLEAR_TASK,如果我重新运行我的应用程序,一切都会正常工作。

这里是宿主Activity

Fragment not attached to an activity

我什么时候收到这个错误?

在完成最后一个活动并且用户返回后,用户可以收到通知,当通知请求我尝试过的上下文时,此方法开始出现错误private var bottomNavigation: BottomNavigationView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_tabbar) val finish = intent.getStringExtra("finish") bottomNavigation = findViewById(R.id.bottomNavigationView) val navigationController = findNavController(R.id.fragment) bottomNavigation?.setupWithNavController(navigationController) bottomNavigation?.itemIconTintList = null val firstFragment: Fragment = Fragment1() val secondFragment: Fragment = Fragment2() val thirdFragment: Fragment = Fragment3() val forthFragment: Fragment = Fragment4() var active = firstFragment supportFragmentManager.beginTransaction().add(R.id.containerb, forthFragment, "4").hide(forthFragment).commit() supportFragmentManager.beginTransaction().add(R.id.containerb, thirdFragment, "3").hide(thirdFragment).commit() supportFragmentManager.beginTransaction().add(R.id.containerb, secondFragment, "2").hide(secondFragment).commit() supportFragmentManager.beginTransaction().add(R.id.containerb, firstFragment, "1").commit() if (finish.equals("true")){ bottomNavigation?.setSelectedItemId(R.id.ordersFragment); supportFragmentManager.beginTransaction().hide(active).show(thirdFragment).commit() active = thirdFragment } bottomNavigation?.setOnNavigationItemReselectedListener { when (it.itemId) { R.id.Fragment1 -> { supportFragmentManager.beginTransaction().hide(active).show(firstFragment).commit() active = firstFragment } R.id.Fragment2 -> { supportFragmentManager.beginTransaction().hide(active).show(secondFragment).commit() active = secondFragment } R.id.Fragment3 -> { supportFragmentManager.beginTransaction().hide(active).show(thirdFragment).commit() active = thirdFragment } R.id.Fragment4 -> { supportFragmentManager.beginTransaction().hide(active).show(forthFragment).commit() active = forthFragment } } true } bottomNavigation?.setOnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.Fragment1 -> { supportFragmentManager.beginTransaction().hide(active).show(firstFragment).commit() active = firstFragment } R.id.Fragment2 -> { supportFragmentManager.beginTransaction().hide(active).show(secondFragment).commit() active = secondFragment } R.id.Fragment3 -> { supportFragmentManager.beginTransaction().hide(active).show(thirdFragment).commit() active = thirdFragment } R.id.Fragment4 -> { supportFragmentManager.beginTransaction().hide(active).show(forthFragment).commit() active = forthFragment } } true } } ,以及获取上下文的所有可能性这里是片段3

requireContext(), this@..Activity, applicationContext, activity.context

logcat 错误

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        createNotificationChannele()
}
private fun newOrderOffers() {
        val uid = FirebaseAuth.getInstance().uid ?: ""
        val firestore = FirebaseFirestore.getInstance()
        val fireRef = firestore.collection("inProcess").whereEqualTo("userUid", uid)
        fireRef.addSnapshotListener { value, error ->
            if (value != null) {
                value.documentChanges.forEach {
                    if (it.type == DocumentChange.Type.ADDED) {

                        SendNotificationWhenSelected()

                    }
                }
            }
        }

    }

private fun createNotificationChannele(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val channel = NotificationChannel(chanal_id, chanale_name,
                NotificationManager.IMPORTANCE_HIGH).apply {
                lightColor = Color.RED
                enableLights(true)
            }
            val manager = this.context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.createNotificationChannel(channel)
        }

    }
private fun SendNotificationWhenSelected(){
        val notification =
            NotificationCompat.Builder(requireContext(), chanal_id) // the error in this line
                .setContentTitle("...")
                .setContentText("....")
                .setSmallIcon(R.drawable.....)
                .setPriority(Notification.PRIORITY_HIGH)
                .setAutoCancel(true)
                .build()

        val notificationManager = NotificationManagerCompat.from(requireView().context)
        notificationManager.notify(notification_id, notification)
}

1 个答案:

答案 0 :(得分:0)

问题似乎在于旧的 Fragment 仍然存在,并且在与旧的 Activity 分离后仍会收到 Firebase 回调。当旧的 Fragment 分离/销毁时,您需要移除 Firebase 回调。

这就是为什么您在返回 TabbarActivity 时会看到此问题,但在您第一次启动应用程序时却不会。

相关问题