У меня есть активность с 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)
во всех фрагментах