android-fragments 如何从主Activity控制导航和backStack

fbcarpbf  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(148)

我有两个活动A和B和三个片段C、D和E。
我使用intent从活动A移动到B,但没有完成活动A,因为我想稍后再回到它。
Activity B包含一个自定义布局和一个片段容器。

  • 自定义布局包含一个文本视图和一个后退图标图像视图。此布局作为操作栏,因为我不使用默认的操作栏,因为活动B的主题是android:theme="@style/AppTheme.NoActionBar”。
  • 片段容器承载导航图。

片段C是起始目的地,导航图允许按照C-〉D-〉E的顺序导航,并按照以下顺序返回堆栈。
C-〉D //在第一个返回堆栈之后
C //在第二个返回堆栈之后到达返回堆栈中最后一个元素
A //活动B完成,再按一次后退图标图像后,活动A继续
按下“返回”图标时,活动B xml中自定义布局的图像视图。
由于在任何片段(C、D、E)中没有其他操作栏,所以我只能使用活动B的后退图标图像视图。

我想知道如何实现此功能我的活动B xml如下所示

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--android:id="@+id/container"-->
    <include layout="@layout/custom_tool_bar"
        android:id="@+id/toolbar_settings_activity"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_dashboard_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/settings_navigation"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar_settings_activity"

        />
</androidx.constraintlayout.widget.ConstraintLayout>

下面给出了自定义工具栏的xml代码

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/app_gradient_color_background">
    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/iv_back"
        android:layout_width="20dp"
        android:layout_height="26dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="1dp"
        android:contentDescription="@string/content_description"
        android:scaleType="fitXY"
        android:src="@drawable/ic_white_color_back_24dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
    <LinearLayout
        android:id="@+id/customlayout_width"
        android:layout_width="wrap_content"
        android:layout_height="?attr/actionBarSize"
        app:layout_constraintStart_toEndOf="@+id/iv_back"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingEnd="10dp"
        android:paddingTop="6dp"
        android:paddingStart="10dp"
        android:text="@string/custom_tool_bar_Name"
        android:textColor="@color/colorOffWhite"
        android:textSize="26sp"/>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

custom layout used as action bar
Activity B when navgraph start destination is set to C fragment
Navgraph to navigate from fragment C->D->E in Activity B

ddhy6vgd

ddhy6vgd1#

1-首先,在活动B中获取navController:

val navHostFragment = binding.navHostDashboardFragment.getFragment<NavHostFragment>()
val navController = navHostFragment.navController

2-然后,您可以将单击侦听器添加到后退按钮:

binding.toolbarSettingsActivity.ivBack.setOnClickListener {
    val isStackPopped = navController.popBackStack() // Navigate back to the last fragment
    if (!isStackPopped) finish() // If there is no fragments in the stack finish the activity and go back to activity A
}

相关问题