Добавить стрелку назад к фрагменту с компонентом навигации - PullRequest
0 голосов
/ 23 апреля 2020

Я реализовал базовый c компонент навигации в приложении, которое состоит из MainActivity , который содержит Панель инструментов (которую я добавил, чтобы иметь функцию стрелки назад) и контейнер фрагмента, начинающийся с Fragment A . В этом фрагменте у меня есть кнопка, которая перенаправляет на пустой фрагмент B .

. Я могу вернуться к фрагменту A (из фрагменту B ) снизу Android навигация с использованием компонента Навигация, но я хочу сделать то же самое, используя стрелку назад на добавленной мной панели инструментов. Я реализовал стрелку, поместив setSupportActionBar (findViewById (R.id.toolbar)) * в Основная активность и (активность в качестве AppCompatActivity) .supportActionBar? .SetDisplayHomeAsUpEnabled (true) on Fragment B , но когда я нажимаю на него, он не перенаправляется на Fragment A , потому что (я полагаю), что задний стек пуст.

MainActivity

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(findViewById(R.id.toolbar))
}

MainActivity xml

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar"
    app:navGraph="@navigation/nav_graph" />

Фрагмент B

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
}

Добавлено это позволяет удалить панель инструментов по умолчанию в стилях . xml

<item name="windowNoTitle">true</item>

В FragmentB кнопка вверх не работает фрагмент B с не работающей спиной

Я хочу сделать это, используя Компонент навигации , есть идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Благодаря @MustafaKhaled я смог найти правильную документацию, которая находится в этой ссылке

Я удалил setDisplayHomeAsUpEnabled фрагмента B (вам не нужно ничего добавлять в этом фрагменте).

Я оставляю это как код стилей. xml.

Моя новая MainActivity выглядит следующим образом:

private lateinit var toolbar: Toolbar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    toolbar = findViewById(R.id.toolbar)
    setupNavigation()
}

private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    val appBarConfiguration = AppBarConfiguration.Builder(navController.graph).build()
    toolbar.setupWithNavController(navController, appBarConfiguration)
}

Следуя этому способу, вы управляете поведением панели инструментов с помощью функции Navigation-UI .


ОБНОВЛЕНИЕ 28/04/20

Существует более простой подход, который не требует панели инструментов, поскольку использует панель по умолчанию.

MainActivity

class MainActivity : AppCompatActivity() {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var navController: NavController

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupNavigation()
}

private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    navController = navHostFragment.navController
    appBarConfiguration = AppBarConfiguration.Builder(navController.graph).build()
    setupActionBarWithNavController(navController, appBarConfiguration)
}

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp(appBarConfiguration)
            || super.onSupportNavigateUp()
}

}

activity_main. xml

<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:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/nav_graph" />

И мои стили. xml файл похож на файл по умолчанию one:

 <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Обновленный репо ссылка

0 голосов
/ 24 апреля 2020

В вашей MainActivity

настройте навигацию:

    private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment?
    navController = navHostFragment!!.navController
    appBarConfiguration = AppBarConfiguration.Builder(setOf(R.id.checklocation,R.id.questions,R.id.news,R.id.profile_tab)).build()
    NavigationUI.setupWithNavController(bottomNavigation,navController)
    NavigationUI.setupActionBarWithNavController(this,navController)
}

, чтобы включить отображение стрелки назад и показывает предыдущий пункт назначения переопределить эту функцию

    override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp()
}

Кстати, используя компонент навигации с нижней навигацией, нам не нужно настраивать вашу панель инструментов, это будет обработано путем добавления вышеуказанных функций в ваш MainActivity.

...