我想在每次选择底部导航项时初始化片段

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)。 从那时起,我的预期行动就成功了。无需刷新片段。

【讨论】:

以上是关于我想在每次选择底部导航项时初始化片段的主要内容,如果未能解决你的问题,请参考以下文章

在底部导航栏中保存片段状态

使用 navhost 在底部导航中停止片段刷新

在选择的底部导航视图项目上重新创建片段

从一个片段移动到另一个片段时如何自动选择底部导航?

如果在底部导航栏中选择了其他项目,如何删除 floatingActionButton 替换片段

片段内容重叠工具栏和底部导航视图