Фрагменты внутри другого фрагмента: cra sh с «еще не прикреплен». - PullRequest
0 голосов
/ 07 февраля 2020

Привет, у меня странная проблема. MainActivity имеет структуру кадра и основной фрагмент EnterFragment. EnterFragment имеет структуру кадра, и я хотел бы увидеть другие 2 фрагмента. RegistrationFragment и LoginFragment. Когда запускается EnterFragment, он показывает SignupFragment.java .. после MainActivity вызывает метод EnterFragment для изменения фрагмента на LoginFragment, но приложение cra sh:

java.lang.IllegalStateException: Fragment EnterFragment{95bc7de (70f980b2-eff8-4e4c-a644-e95544b73584)} has not been attached yet.
    at androidx.fragment.app.Fragment.getChildFragmentManager(Fragment.java:923)

Здесь проект: https://www.dropbox.com/s/qq1kl4qw688ipjr/example.zip?dl=0

Здесь код:

//MainActivity
class MainActivity : AppCompatActivity() {
    private var enterFragment: EnterFragment?=null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        showEnter()
    }
    private fun showEnter() {
            enterFragment=  EnterFragment.newInstance()
            this.replaceFragmentTransition(R.id.fragmentContainer, EnterFragment.newInstance(), EnterFragment.TAG )
            var handler= Handler()
            handler.postDelayed(Runnable {gotoLoginFromSignup() }, 8000)
        }
    private fun gotoLoginFromSignup() {
        enterFragment?.gotoLogin()
    }
}

//EnterFragment
    class EnterFragment : Fragment() {

        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_enrer, container, false)
        }
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
            this.replaceFragmentTransition(R.id.fmContainer, SignuFragment.newInstance(), SignuFragment.TAG )
        }
        fun gotoLogin(){
            this.replaceFragmentTransition(R.id.fmContainer, LoginFragment.newInstance(), SignuFragment.TAG )
        }

        companion object {
            val TAG: String="EnterFragment"
            @JvmStatic
            fun newInstance() = EnterFragment()
        }
    }
    //SignupFragment
    class SignuFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_signup, container, false)
        }
        companion object {
            val TAG: String="SignuFragment"
            @JvmStatic
            fun newInstance() = SignuFragment()
        }
    }
    //LoginFragment
    class LoginFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return inflater.inflate(R.layout.fragment_login, container, false)
        }
        companion object {
            val TAG: String="LoginFragment"
            @JvmStatic
            fun newInstance() = LoginFragment()
        }
    }
    //EXTENSIONS
    fun FragmentActivity.replaceFragmentTransition(
        container: Int,
        fragment: Fragment?,
        tag: String
    ) {
        fragment?.let {
            var transition = this.supportFragmentManager
                .beginTransaction()
            transition.replace(container, it, tag)
                .commitNowAllowingStateLoss()
        }
    }
    fun Fragment.replaceFragmentTransition(
        container: Int,
        fragment: Fragment?,
        tag: String
    ) {
        fragment?.let {
                var transition = this.childFragmentManager
                    .beginTransaction()
                transition.replace(container, it, tag)
                    .commitNowAllowingStateLoss()
            }
    }
    //main activity layout
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/fragmentContainer"
            android:layout_width="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_height="0dp" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    //enterFragment
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".EnterFragment">
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/fmContainer"
            android:layout_width="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_height="0dp" />
    </androidx.constraintlayout.widget.ConstraintLayout>

1 Ответ

1 голос
/ 07 февраля 2020

Замените это

this.replaceFragment(R.id.fragmentContainer, FatherFragment.newInstance(), FatherFragment.TAG )

на

  this.replaceFragment(R.id.fragmentContainer, fatherFragment!!, FatherFragment.TAG )

во время транзакции вы передаете другой экземпляр и вызываете openLogin () с другим экземпляром.

FatherFragment.newInstance() will give new instance.
...