android - 如何使用 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) 的视图
解决方案
无论我做什么,使用 ChildFragmentMAnager 对我的应用程序都不起作用,但我找到了一个有用的链接来解决我的问题: 如何从片段中打开片段(kotlin)
我的工作代码:
btn_signup.setOnClickListener {
signUpFragment = SignUpFragment();
val transaction = activity?.supportFragmentManager?.beginTransaction()
transaction?.replace(R.id.frame_layout, signUpFragment)
transaction?.addToBackStack("BackToSignInPage")
transaction?.commit()
}
推荐阅读
- google-cloud-platform - 通过 Cloud Identity-Aware 代理连接失败
- android - 当我的服务发生崩溃时,华为崩溃服务无法正常工作
- sql - 如何通过oracle regexp_substr() 提取“/”字符之前的部分
- python - 将向量 (1 x N) 乘以张量 (N x M x M)
- javascript - 获取每一行文本元素
- xml - 使用各种命名空间时如何在 XSL 中获取 XML 内容
- drupal - 使用 Drupal 使用 rest api
- c# - Xunit 中的模拟 Dll
- html - 如何在 HTML 中创建“复杂”标题?
- javascript - React-admin:使用文档中显示的自定义登录页面时出错