Как перехватить щелчки меню MainActivity BottomNavigationView из фрагмента - PullRequest
0 голосов
/ 21 ноября 2018

Мое приложение работает как мастер.У меня есть активность, которая служит централизацией для всех моих фрагментов.Существует BottomNavigationView с кнопкой «Далее», которая появляется в каждом фрагменте для управления мастером.

Когда я хочу перейти к следующему, я вызываю "action_next" из BottomNavMenu, и он переходит к следующему фрагменту.

Но мне нужно выполнить некоторые действия, когда пользователь нажимает кнопку Next в контекстеэтого фрагмента (например, хранить введенные данные).Кроме того, мне нужно отменить навигацию, если есть какие-либо проблемы с данными, введенными пользователем.

При первой попытке я сделал это в своем фрагменте:

val controller = NavHostFragment.findNavController(this)

        controller.addOnNavigatedListener { controller, navDestination: NavDestination ->

            when (navDestination.id) {
                R.id.destination_setup_tournment -> {
                    proceedNavigation(controller, navDestination)

                }

            }
        }


private fun proceedNavigation(controller: NavController, navDestination: NavDestination) {
    val teams = teamAdapter.getItems()
    if (validateSubmit(teams)){
        presenter.saveTeams(teams)
    }else{
        //how to cancel navigation and stay on this fragment?
    }
}

Но это не выглядит хорошим или даже правильным для меня, и я не знаю, как отменить навигацию, если что-тонеправильно.

Вот файлы, связанные с приложением:

MainActivity:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?colorPrimary"
    android:theme="@style/ToolbarTheme" />

<fragment
    android:id="@+id/nav_host_fragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/navigation"
    app:defaultNavHost="true" />
<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_nav_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:menu="@menu/bottom_nav"
    style="@style/Widget.MaterialComponents.BottomNavigationView"
    >


</com.google.android.material.bottomnavigation.BottomNavigationView>

bottom_nav.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_next" android:title="@string/tornment_mode" android:icon="@drawable/ic_navigate_next_black_24dp" />

</menu>

1 Ответ

0 голосов
/ 21 ноября 2018

Нет способа «отменить» событие навигации - вам нужно поместить свою бизнес-логику на саму кнопку / слушатель и вызывать navigate() только тогда, когда вы действительно хотите перемещаться.

Создание обратных вызовов событий к документации по деятельности использует один подход для соединения вашей Деятельности и Фрагмента, используя onAttach(Context), чтобы получить ссылку на вашу Активность и установить свойство, обратный вызов и т. Д.

Например,, вы можете подумать о том, чтобы сделать что-то вроде:

// In your Activity
var onNextClicked: () -> Unit = {}

// In your Activity's onCreate()
button.setOnClickListener = View.OnClickListener {
  onNextClicked.invoke()
}

// In your Fragment
override fun onAttach(context: Context) {
  (context as YourActivity).onNextClicked = {
    val teams = teamAdapter.getItems()
    if (validateSubmit(teams)){
      presenter.saveTeams(teams)
      findNavController().navigate(R.id.action_next)
    }
  }
}

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

Если вымертвый набор в BottomNavigationView вместо того, чтобы просто использовать фактическую кнопку, вы захотите установить свой собственный OnNavigationItemSelectedListener, и этот слушатель вызовет лямбду onNextClicked, если вы используете этот пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...