Модульное приложение Android для одного действия с зависимостями циклических фрагментов - PullRequest
0 голосов
/ 30 апреля 2018

У нас есть приложение с нижней панелью навигации. Навигация в нашем MainActivity. Мы управляем навигацией между различными экранами приложения с фрагментами. Например. Есть:

  • ProductFragment
  • LoginFragment
  • CartFragment
  • ProfileFragment
  • SearchFragment

В нашем MainActivity у нас есть метод pushFragment(Fragment fragment), который отвечает за замену текущего фрагмента новым фрагментом. Между нашими разными фрагментами есть много зависимостей. E.g.:

  • пользователь может запустить ProductFragment с CartFragment
  • Чтобы увидеть определенные данные о продукте, пользователь должен войти в систему (LoginFragment)
  • LoginFragment также используется с ProfileFragment
  • Посредством «исторических заказов» в ProfileFragment вы также можете отображать сведения о продукте через ProductFragment.

Fragment Dependencies

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

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

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

1 Ответ

0 голосов
/ 09 января 2019

Мы нашли начало решения:

У нас есть интерфейс NavigationHelper, который объявляет методы для перехода к другим фрагментам (startProfileFragment, startLoginFragment, startProductFragment, ...). Этот интерфейс находится в нашей libBase. Это реализовано в Activity, которая находится в модуле приложения.

Во фрагменте мы приводим context в onAttach к NavigationHelper (также проверяем, что контекст является NavigationHelper, и в противном случае генерируем исключение):

private NavigationHelper mNavigationHelper;

public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof NavigationHelper){
        mNavigationHelper = (NavigationHelper) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement NavigationHelper");
    }
} 

Тогда вы можете просто позвонить mNavigationHelper.startProfileFragment() для переключения фрагментов.

Спасибо @Andrey за напоминание о публикации этого:)

...