【问题标题】:java.lang.IllegalStateException: FragmentManager has not been attached to a hostjava.lang.IllegalStateException:FragmentManager 尚未附加到主机
【发布时间】:2020-08-27 15:46:15
【问题描述】:

我正在使用 MVP 并创建了一个回调,该回调在登录屏幕中按下按钮时执行,并且实现在 MainActivity 中,在执行回调片段替换(不工作)后,我还放了一个检查。

if(!isAdded){
   return null
}

我已经尝试为每个片段创建新实例,但仍然没有运气。我被困了一段时间,请帮帮我。

主要活动

 class MainActivity : AppCompatActivity(), IMainActivityContract.View {
    private lateinit var fragmentManager: FragmentTransaction

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Constants.mAuth = FirebaseAuth.getInstance()
        changeFragment(Constants.NAV_FRAG_LOGIN)
    }


    override fun changeFragment(fragmentID: Int) {
        if(supportFragmentManager.isDestroyed || supportFragmentManager.fragments.isEmpty()){
            fragmentManager = supportFragmentManager.beginTransaction()
        }

        try {
            when (fragmentID) {
                Constants.NAV_FRAG_LOGIN -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentLogin()).commit()
                }

                Constants.NAV_FRAG_MAIN -> {
                    fragmentManager.replace(R.id.fragmentContainer, FragmentMain()).commit()

                }

                Constants.NAV_FRAG_ADDITION -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentAddition()).commit()

                }

                Constants.NAV_FRAG_CONFIGURATION -> {
                    fragmentManager.replace(R.id.fragmentContainer,FragmentConfiguration()).commit()

                }
            }
        } catch (message: IllegalStateException) {
            Log.d("LoginDebug", "Exception is: $message")
            message.printStackTrace()
        }
    }
}

主要活动合约

    interface IMainActivityContract {
       interface View{
           fun changeFragment(fragmentID: Int)
       }

       interface Presenter{
          //not yet implemented
       }
} 

触发回调的片段

class FragmentLogin : Fragment(), IFragmentLoginContract.View {
        private var fragmentLoginBinding: FragmentLoginBinding? = null
        private lateinit var fragmentLoginPresenter: IFragmentLoginContract.Presenter
        private lateinit var mainActivityView: IMainActivityContract.View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
             val view = inflater.inflate(R.layout.fragment_login, container, false)

             mainActivityView = MainActivity()
             fragmentLoginPresenter = FragmentLoginPresenter(this)
             fragmentLoginBinding = FragmentLoginBinding.bind(view)
             
              onGmailLogin()
              return view
        }

 private fun onGmailLogin() {
        fragmentLoginBinding?.frameLayoutGmailButtonLogin!!.setOnClickListener {
            fragmentLoginPresenter.onGoogleLogin()

            mainActivityView.changeFragment(Constants.NAV_FRAG_MAIN)
        }
    }
}

错误日志

异常是:java.lang.IllegalStateException:FragmentManager 尚未连接到主机。 2020-08-27 20:19:05.637 8456-8456/me.timezoneplanner W/System.err: java.lang.IllegalStateException: FragmentManager 尚未连接到主机。 2020-08-27 20:19:05.637 8456-8456/me.timezoneplanner W/System.err: 在 androidx.fragment.app.FragmentManager.enqueueAction(FragmentManager.java:1739) 2020-08-27 20:19:05.637 8456-8456/me.timezoneplanner W/System.err: 在 androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:321) 2020-08-27 20:19:05.637 8456-8456/me.timezoneplanner W/System.err: 在 androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:286) 2020-08-27 20:19:05.638 8456-8456/me.timezoneplanner W/System.err: 在 me.timezoneplanner.activities.MainActivity.changeFragment(MainActivity.kt:41) 2020-08-27 20:19:05.638 8456-8456/me.timezoneplanner W/System.err: 在 me.timezoneplanner.fragments.login.FragmentLogin$onGmailLogin$1.onClick(FragmentLogin.kt:53)

【问题讨论】:

  • 能否添加错误日志
  • @McSlinPlay 刚刚在编辑后添加了登录 :)

标签: android kotlin android-mvp


【解决方案1】:

您不应使用 MainActivity() 的新实例初始化 mainActivityView,而应使用其正确的父实例对其进行初始化。

替换

mainActivityView = MainActivity()

与

mainActivityView = (activity as MainActivity)

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2015-11-16
    • 2014-05-13
    • 1970-01-01
    • 2022-07-03
    • 2018-01-03
    • 2020-08-27
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多