首页 > 解决方案 > 如何使用 childFragmentManager 从另一个片段打开一个片段?

问题描述

我的活动有一个用于片段的 FrameLayout 容器和一个用于在片段之间导航的 BottomNavigationView:主页、商店、帐户和购物车。在这些片段之间导航可以正常工作,但是当按下“注册”按钮时从 AccountFragment 导航到新片段(SignUpFragment)时,它会崩溃。

使用 supportFragmentManager 不像在 MAinActivity 中那样工作,所以我尝试使用 childFragmentManager,但应用程序崩溃,因为它在 MainActivity 中找不到 FrameLayout 容器。

主要行为:

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()

}

布局主要:

<?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()
    }

}
}

logcat 中的错误消息是:

java.lang.IllegalArgumentException:没有为片段 SignUpFragment {b0a086e (7c1e4b61-3b07-48dd-b700-83748b0714c6) id=0x7f0800b7} 找到 id 0x7f0800b7 (no.store.maast:id/frame_layout) 的视图

标签: androidkotlinandroid-fragments

解决方案


无论我做什么,使用 ChildFragmentMAnager 对我的应用程序都不起作用,但我找到了一个有用的链接来解决我的问题: 如何从片段中打开片段(kotlin)

我的工作代码:

 btn_signup.setOnClickListener {

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

    }

推荐阅读