0

My activity has a FrameLayout container for fragments and a BottomNavigationView to navigate between the fragments: Home, shop, account and cart. Navigating between these fragments works fine, but when navigating to new fragment (SignUpFragment) from AccountFragment when pushing the button 'signup' it crashes.

using supportFragmentManager didnt work like in MAinActivity so i am trying to use childFragmentManager instead, but the app crashes because it can not find the FrameLayout container in MainActivity.

MainAct:

class MainActivity : AppCompatActivity() {

lateinit var homeFragment: HomeFragment;
lateinit var shopFragment: ShopFragment;
lateinit var accountFragment: AccountFragment;
lateinit var cartFragment: CartFragment;


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

    homeFragment = HomeFragment()
    makeCurrentFragment(homeFragment)

    btm_nav.setOnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.home -> {
                homeFragment = HomeFragment()
                makeCurrentFragment(homeFragment)
            }

            R.id.shop -> {
                shopFragment = ShopFragment()
                makeCurrentFragment(shopFragment)
            }

            R.id.account -> {
                accountFragment = AccountFragment()
                makeCurrentFragment(accountFragment)
            }

            R.id.cart -> {
                cartFragment = CartFragment()
                makeCurrentFragment(cartFragment)
            }
        }
        true
    }
}

fun makeCurrentFragment(fragment: Fragment) =
    supportFragmentManager.beginTransaction().replace(R.id.frame_layout, fragment)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)                      //open = adds a new fragment to the stack
        .commit()

}

Layout main:

<?xml version="1.0" encoding="utf-8"?>

  <RelativeLayout
    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"
    android:background="@color/colorwhite"
    tools:context=".MainActivity"
    tools:ignore="ExtraText">

 <FrameLayout
   android:id="@+id/frame_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_above="@+id/btm_nav"
   android:layout_marginBottom="12dp" />

 <com.google.android.material.bottomnavigation.BottomNavigationView
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:id="@+id/btm_nav"
   android:layout_alignParentBottom="true"
   app:itemBackground="@color/colorwhite"
   app:menu="@menu/bottom_nav"/>

 </RelativeLayout>

AccountFragmenet:

class AccountFragment : Fragment() {

lateinit var signUpFragment: SignUpFragment;

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

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

    btn_forgotPass.setOnClickListener {
        Toast.makeText(
            activity, "btn forgot pressed",
            Toast.LENGTH_SHORT
        ).show()
    }

    btn_signIn_google.setOnClickListener {
        Toast.makeText(
            activity, "btn google pressed.",
            Toast.LENGTH_SHORT
        ).show()
    }

    btn_login.setOnClickListener {
        Toast.makeText(
            activity, "btn login pressed.",
            Toast.LENGTH_SHORT
        ).show()
    }



 /**********    The problem is here           ****/


    btn_signup.setOnClickListener {

        signUpFragment = SignUpFragment();

        childFragmentManager.beginTransaction().replace(R.id.frame_layout, signUpFragment)
             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .commit()
    }

}
}

Errormessage in logcat is :

java.lang.IllegalArgumentException: No view found for id 0x7f0800b7 (no.store.maast:id/frame_layout) for fragment SignUpFragment{b0a086e (7c1e4b61-3b07-48dd-b700-83748b0714c6) id=0x7f0800b7}

Nikola Despotoski
  • 49,966
  • 15
  • 119
  • 148
Rosso
  • 93
  • 2
  • 9

2 Answers2

0

you can't access your frame layout in account fragment . you must replace your fragment with your account fragment root layout .

  btn_signup.setOnClickListener {

        signUpFragment = SignUpFragment();

        childFragmentManager.beginTransaction()

// give an id to your layout root account fragment
.replace(R.id.accountFragmentId, signUpFragment)
             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .commit()
    }
Bahador Eslami
  • 372
  • 2
  • 13
0

Using ChildFragmentMAnager did not work on mine application no matter what I did, but i found a useful link that solved my problem: How do i open fragment from fragment (kotlin)

My working code :

 btn_signup.setOnClickListener {

        signUpFragment = SignUpFragment();
        val transaction = activity?.supportFragmentManager?.beginTransaction()
        transaction?.replace(R.id.frame_layout, signUpFragment)
        transaction?.addToBackStack("BackToSignInPage")
        transaction?.commit()

    }
Rosso
  • 93
  • 2
  • 9