我想在每次选择底部导航项时初始化片段
Posted
技术标签:
【中文标题】我想在每次选择底部导航项时初始化片段【英文标题】:I want to initialize the fragment every time the bottom navigation item is selected 【发布时间】:2021-10-21 20:47:35 【问题描述】:下面的代码是点击底部导航时运行的函数。
fun replaceFragment(fragment: Fragment)// 프래그먼트 교체 함수
Log.d("MainAcitvity", "fragment replace + $fragment")
//Fragment Start Remove
supportFragmentManager.beginTransaction().apply
remove(fragment)
commit()
//Fragment Start Replace
supportFragmentManager.beginTransaction().apply
replace(R.id.fragmentContainer, fragment)
commit()
Log.d("MainAcitvity", "fragment replace start + $fragment")
//end of replaceFragment
bottomNavigationView.setOnNavigationItemSelectedListener
when (it.itemId)
R.id.fragment1 ->
adjustGravity(bottomNavigationView)
R.id.fragment2 ->
replaceFragment(Fragment2)
R.id.fragment3 ->
replaceFragment(Fragment3)
R.id.fragment4 ->
replaceFragment(Fragment4)
true
//end of setOnNavigationItemSelectedListener
但这不起作用。
我正在尝试这样做,因为我正在使用 CoordinatorLayout 向上滚动 AppLayout 函数。
当我向下滚动并转到另一个片段时, 如上图所示,它没有初始化。
在 NestedScrollView 中,每个 Fragment 的 On Pause() 都会显示在 我尝试了 NestedScrollView.scrollTo(0,0),但它不起作用。
我也尝试过初始化 OnCreateView(),但它也不起作用。
我认为 Fragments 在 MainActivity 中工作,生命周期是个问题。
以下是其中一个片段的示例。
<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/CoordinatorLayout"
android:layout_
android:layout_>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/fragment3ToolbarFrame"
android:layout_
android:layout_
android:background="@android:color/transparent"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_
android:layout_
android:minHeight="50dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/fragment3ImageView"
android:layout_
android:layout_
android:background="@color/talk_toolbar_color" />
<TextView
android:layout_
android:layout_
android:layout_marginStart="@dimen/fragment3_title_margin_start"
android:layout_marginTop="@dimen/fragment3_title_margin_top"
android:fontFamily="@font/notosanscjkkr_medium"
android:includeFontPadding="false"
android:text="@string/fragment3_tag_title"
android:textColor="@color/white"
android:textSize="@dimen/fragment3_title_size" />
<TextView
android:layout_
android:layout_
android:layout_marginStart="@dimen/fragment3_subtitle_margin_start"
android:layout_marginTop="@dimen/fragment3_subtitle1_margin_top"
android:fontFamily="@font/notosanscjkkr_regular"
android:includeFontPadding="false"
android:text="@string/fragment3_tag_subtitle1"
android:textColor="@color/white"
android:textSize="@dimen/fragment3_subtitle_size" />
<TextView
android:id="@+id/fragment3_tagText3"
android:layout_
android:layout_
android:layout_marginStart="@dimen/fragment3_subtitle_margin_start"
android:layout_marginTop="175dp"
android:fontFamily="@font/notosanscjkkr_regular"
android:includeFontPadding="false"
android:text="@string/fragment3_tag_subtitle2"
android:textColor="@color/white"
android:textSize="12dp" />
<TextView
android:id="@+id/fragment3AppbarTextView"
android:layout_
android:layout_
android:layout_marginStart="36dp"
android:layout_marginTop="225dp"
android:fontFamily="@font/notosanscjkkr_medium"
android:includeFontPadding="false"
android:text="@string/fragment3_tag_title"
android:textColor="@color/white"
android:textSize="50sp"
android:visibility="gone" />
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:id="@+id/fragment3NestedScrollView"
android:layout_
android:layout_
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_
android:layout_
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/fragment3RecyclerView"
android:layout_
android:layout_
android:layout_margin="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/addFloatingButton"
android:layout_
android:layout_
android:layout_margin="16dp"
android:backgroundTint="#447BE3"
android:src="@drawable/ic_baseline_create_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:tint="@null" />
</androidx.constraintlayout.widget.ConstraintLayout>
我想以任何方式初始化片段。有什么办法吗?
【问题讨论】:
【参考方案1】:如果您想在第二次单击 BottomNavigationView 时再次初始化 Fragment,请使用 setOnNavigationItemReSelectedListener 并用您需要的新片段替换您的容器。
【讨论】:
如您所知,我尝试在上图中的 setOnNavigationItemReselectedListener 上插入 replaceFragment 函数,但效果不一样。 另外,setOnNavigationItemReselectedListener 不是我想要的。 This happened when the same tab was selected.【参考方案2】:我在初始化函数中添加了 AppBarLayout.setExpended(true)。 从那时起,我的预期行动就成功了。无需刷新片段。
【讨论】:
以上是关于我想在每次选择底部导航项时初始化片段的主要内容,如果未能解决你的问题,请参考以下文章