如何重新附加片段(片段未附加到 activity Kotlin)
How to reattach Fragment (fragment Not not attached to an activity Kotlin)
我对这个错误 Fragment not attached to an activity 感到很沮丧,我有一个片段开始一个 activity 并且 activity 开始另一个 activity 所以等等 F -> A1 -> A2 -> A3
,在我完成最后一个 A3
之后,我打电话回到托管 activity
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()
但是当我设置 Intent.FLAG_ACTIVITY_CLEAR_TASK
时,它从 activity 中分离了我的片段,然后我得到了这个错误 Fragment not attached to an activity
,如果我重新运行我的应用程序,一切都会正常工作。
这里是主机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
}
}
我什么时候收到这个错误?
在完成最后一个 activity 并且用户向后导航后,用户可以收到通知,当通知请求上下文时,错误从这个方法开始,我已经尝试过 requireContext(), this@..Activity, applicationContext, activity.context
,以及所有可能性获取上下文这是 Fragment3
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)
}
logcat 错误
java.lang.IllegalStateException: Fragment Fragment3{3131d71} (ee9f090f-fa37-46a0-9fda-b7e9831db10d)} not attached to an activity.
at androidx.fragment.app.Fragment.requireActivity(Fragment.java:833)
at com.qp.dele.fragment.Fragment3.SendNotificationWhenSelected(3Fragment.kt:295)
at com.qp.dele.fragment.Fragment3.access$SendNotificationWhenSelected(Fragment3.kt:40)
at com.qp.dele.fragment.Fragment3$newOrderOffers.onEvent(Fragment3.kt:272)
at com.qp.dele.fragment.Fragment3$newOrderOffers.onEvent(Fragment3.kt:40)
at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal(Query.java:1133)
at com.google.firebase.firestore.Query$$Lambda.onEvent(Unknown Source:6)
at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent[=14=](AsyncEventListener.java:42)
at com.google.firebase.firestore.core.AsyncEventListener$$Lambda.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
看起来问题在于旧的 Fragment
仍然存在,并且在与旧的 Activity
分离后仍在获取 Firebase 回调。当旧 Fragment
为 detached/destroyed.
时,您需要删除 Firebase 回调
这就是为什么您在 return 返回 TabbarActivity
时会看到此问题,但在您首次启动应用程序时却不会。
我对这个错误 Fragment not attached to an activity 感到很沮丧,我有一个片段开始一个 activity 并且 activity 开始另一个 activity 所以等等 F -> A1 -> A2 -> A3
,在我完成最后一个 A3
之后,我打电话回到托管 activity
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()
但是当我设置 Intent.FLAG_ACTIVITY_CLEAR_TASK
时,它从 activity 中分离了我的片段,然后我得到了这个错误 Fragment not attached to an activity
,如果我重新运行我的应用程序,一切都会正常工作。
这里是主机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
}
}
我什么时候收到这个错误?
在完成最后一个 activity 并且用户向后导航后,用户可以收到通知,当通知请求上下文时,错误从这个方法开始,我已经尝试过 requireContext(), this@..Activity, applicationContext, activity.context
,以及所有可能性获取上下文这是 Fragment3
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)
}
logcat 错误
java.lang.IllegalStateException: Fragment Fragment3{3131d71} (ee9f090f-fa37-46a0-9fda-b7e9831db10d)} not attached to an activity.
at androidx.fragment.app.Fragment.requireActivity(Fragment.java:833)
at com.qp.dele.fragment.Fragment3.SendNotificationWhenSelected(3Fragment.kt:295)
at com.qp.dele.fragment.Fragment3.access$SendNotificationWhenSelected(Fragment3.kt:40)
at com.qp.dele.fragment.Fragment3$newOrderOffers.onEvent(Fragment3.kt:272)
at com.qp.dele.fragment.Fragment3$newOrderOffers.onEvent(Fragment3.kt:40)
at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal(Query.java:1133)
at com.google.firebase.firestore.Query$$Lambda.onEvent(Unknown Source:6)
at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent[=14=](AsyncEventListener.java:42)
at com.google.firebase.firestore.core.AsyncEventListener$$Lambda.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
看起来问题在于旧的 Fragment
仍然存在,并且在与旧的 Activity
分离后仍在获取 Firebase 回调。当旧 Fragment
为 detached/destroyed.
这就是为什么您在 return 返回 TabbarActivity
时会看到此问题,但在您首次启动应用程序时却不会。