Android日常(03) Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{2f4a09} not attached

本文探讨了在Android开发中遇到的Fragment未附加到Context错误,特别是在Activity上带有多个子Fragment的情况下。通过使用isAdded()方法,可以有效地判断并处理Fragment的状态,避免运行时异常。

Android日常(03) Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{2f4a09} not attached to a context.

写在前面的话

出现这个问题的原因并没有找到

问题出现的场景

Activiy上面有个Fragment,Fragment上面又有三个子Fragment,在第二个Fragment上面做Event监听

处理方式

用到的技术主要有:fragment isAdded方法判断当前fragment是在渲染添加状态

    
  ExBaseFragment fragment = ((XXXFragment) mTabFragments.get(i));
            if (fragment.isAdded()) {
                fragment.reFreshFragData();

            }

结束语

喜欢加个关注支持一下后续会有更多更新内容

我的代码提示: FATAL EXCEPTION: main Process: com.example.todolist, PID: 25632 androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.todolist.ui.settings.SettingsFragment: calling Fragment constructor caused an exception at androidx.fragment.app.Fragment.instantiate(Fragment.java:695) at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57) at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:663) at androidx.navigation.fragment.FragmentNavigator.createFragmentTransaction(FragmentNavigator.kt:394) at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:329) at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:308) at androidx.navigation.NavController.navigateInternal(NavController.kt:265) at androidx.navigation.NavController.navigate(NavController.kt:1832) at androidx.navigation.NavController.navigate(NavController.kt:1668) at androidx.navigation.NavController.navigate(NavController.kt:1595) at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.kt:96) at androidx.navigation.ui.NavigationUI.setupWithNavController$lambda$6(NavigationUI.kt:631) at androidx.navigation.ui.NavigationUI.$r8$lambda$WstRxbcmMw_4X03-oLYYK21cjjU(Unknown Source:0) at androidx.navigation.ui.NavigationUI$$ExternalSyntheticLambda4.onNavigationItemSelected(D8$$SyntheticClass:0) at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:449) at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:833) at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157) at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:984) at com.google.android.material.navigation.NavigationBarMenuBuilder.performItemAction(NavigationBarMenuBuilder.java:94) at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:168) at android.view.View.performClick(View.java:6291) at android.view.View$PerformClick.run(View.java:24931) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7425) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:334) at androidx.fragment.app.Fragment.instantiate(Fragment.java:677) at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)  at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:663)  at androidx.navigation.fragment.FragmentNavigator.createFragmentTransaction(FragmentNavigator.kt:394)  at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:329)  at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:308)  at androidx.navigation.NavController.navigateInternal(NavController.kt:265)  at androidx.navigation.NavController.navigate(NavController.kt:1832)  at androidx.navigation.NavController.navigate(NavController.kt:1668)  at androidx.navigation.NavController.navigate(NavController.kt:1595)  at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.kt:96)  at androidx.navigation.ui.NavigationUI.setupWithNavController$lambda$6(NavigationUI.kt:631)  at androidx.navigation.ui.NavigationUI.$r8$lambda$WstRxbcmMw_4X03-oLYYK21cjjU(Unknown Source:0)  at androidx.navigation.ui.NavigationUI$$ExternalSyntheticLambda4.onNavigationItemSelected(D8$$SyntheticClass:0)  at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:449)  at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:833)  at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157)  at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:984)  at com.google.android.material.navigation.NavigationBarMenuBuilder.performItemAction(NavigationBarMenuBuilder.java:94)  at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:168)  at android.view.View.performClick(View.java:6291)  at android.view.View$PerformClick.run(View.java:24931)  at android.os.Handler.handleCallback(Handler.java:808)  at android.os.Handler.dispatchMessage(Handler.java:101)  at android.os.Looper.loop(Looper.java:166)  at android.app.ActivityThread.main(ActivityThread.java:7425)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)  Caused by: java.lang.IllegalStateException: Fragment SettingsFragment{58b3c8} (4279694b-baf1-41af-b3ed-bc4b82cadac7) not attached to a context. at androidx.fragment.app.Fragment.requireContext(Fragment.java:977) at com.example.todolist.ui.settings.SettingsFragment.<init>(SettingsFragment.kt:18) 代码如下: class SettingsFragment : BaseFragment<FragmentSettingsBinding>() { private val themeDisplayNames = arrayOf( requireContext().getString(R.string.settings_theme_item_system), requireContext().getString(R.string.settings_theme_item_dark), requireContext().getString(R.string.settings_theme_item_light), ) private val themeItems = arrayOf( requireContext().getString(R.string.settings_theme_item_system_value), requireContext().getString(R.string.settings_theme_item_dark_value), requireContext().getString(R.string.settings_theme_item_light_value), ) private lateinit var preferenceManagerLocal: PreferenceManagerLocal private var navController: NavController? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) super.onCreate(savedInstanceState) preferenceManagerLocal = PreferenceManagerLocal(requireContext()) navController = view.findNavController() viewBinding.cardTheme.setOnClickListener { val currentTheme = preferenceManagerLocal.theme val currentIndex = themeItems.indexOfFirst { it == currentTheme.toString() } MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.settings_theme) .setSingleChoiceItems(themeDisplayNames, currentIndex) { dialog, which -> val selectedValue = themeItems[which] val selectedTheme = PreferenceManagerLocal.Theme.parse(selectedValue) preferenceManagerLocal.theme = selectedTheme PreferenceManagerLocal.setTheme(selectedTheme) TaskWidgetProvider.triggerRefreshTheme(requireContext()) viewBinding.tvSort.text = themeDisplayNames[which] dialog.dismiss() } .setNegativeButton(getString(R.string.cancel), null) .show() } viewBinding.cardWidget.setOnClickListener { navController?.navigate(R.id.widget_setting_fragment) } } }
最新发布
09-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值