Интерфейс вызова активности в нескольких фрагментах - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть активность с ViewPager, ViewPager содержит 3 фрагмента

1. A barcode scanner camera fragment, 2. A map fragment 3. and a recyclerview fragment

Когда приложение запускается, я перехожу к фрагменту 2 (фрагменту карты), но, как мы знаем, ViewPager загружает более 1 фрагмента за раз для более плавного перехода, из-за этого Barcode scanner on fragment 1 также инициализируется и запускается в Исходя из этого, моим решением было сделать interface в моей деятельности, например:

public class ControllerActivity extends AppCompatActivity{

    private PageNumberListener pageNumberListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_controller);
      ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
      BarcodeScannerFragment barcodeScannerFragment = new BarcodeScannerFragment();
      pageNumberListener = barcodeScannerFragment;
      adapter.addFragment(barcodeScannerFragment);

      viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            pageNumberListener.onCurrentPageChanged(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    }

    public interface PageNumberListener {
      void onCurrentPageChanged(int pageNumber);
    }
}

И реализовал это в моем BarcodeFragment, как

  public class BarcodeScannerFragment extends Fragment implements ControllerActivity.PageNumberListener {


    @Override
    public void onCurrentPageChanged(int pageNumber) {


    }


  }

И запустить / остановить сканирование в onCurrentPageChanged(in pageNumber)

Теперь моя проблема заключается в том, что мне нужно реализовать этот интерфейс во всех других моих фрагментах, и когда действие вызывает onCurrentPageChanged(in pageNumber), я хочу, чтобы все 3 фрагмента получили сигнал, и каждый делал то, что должен делать, например, когда пользователь прокручивает от BarcodeScannerFragment до MapFragment. Я хочу, чтобы метод был запущен, чтобы BarcodeScannerFragment мог остановить сканирование и MapFragment возобновить обновление местоположения, то же самое относится к RecyclerViewFragment, когда пользователь прокрутка от MapFragment до RecyclerViewFragment. Я хочу, чтобы MapFragment останавливал обновления местоположения, а RecyclerViewFragment извлекал данные из списка. Можно было бы сказать, что я использую onResume(), но я чувствую, что он не работает соответственно. Кто-нибудь знает, как я могу сделать это возможным? Я пытался создать BaseFragment как

  public class BaseFragment extends Fragment implements ControllerActivity.PageNumberListener  {


      @Override
      public void onCurrentPageChanged(int pageNumber) {

      }
  }

И каждый фрагмент расширяет его как

 public class MapFragment extends BaseFragment  {
          @Override
          public void onCurrentPageChanged(int pageNumber) {
            super.onCurrentPageChanged(pageNumber)
          }
}

public class BarCodeScannerFragment extends BaseFragment  {
          @Override
          public void onCurrentPageChanged(int pageNumber) {
            super.onCurrentPageChanged(pageNumber)
          }
}


public class RecyclerViewFragment extends BaseFragment  {
          @Override
          public void onCurrentPageChanged(int pageNumber) {
            super.onCurrentPageChanged(pageNumber)
          }
}

А в моей деятельности

  viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            pageNumberListener = (PageNumberListener) adapter.getItem(position);
            pageNumberListener.onCurrentPageChanged(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

Это работает, но очень поверхностно, срабатывает только для текущего фрагмента, я не знаю, как один вызов может запустить onCurrentPageChanged(position) во всех фрагментах

1 Ответ

0 голосов
/ 30 апреля 2019

С комментарием Марцина я добился успеха, я зарегистрировал EventBus в моих BaseFragment и Override onPageChanged(Integer currentPage) в моих Fragments соответственно

public class BaseFragment extends Fragment  {


@Subscribe(threadMode = ThreadMode.MAIN)
public void onPageChanged(Integer currentPage) {

}

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

}

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

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            EventBus.getDefault().post(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

И моя проблема была решена!:)

...