Вызвать фрагмент 2 и передать ему данные только после завершения загрузки фрагмента 1.

У меня есть MainActivity с двумя фрагментами. Фрагмент 1 – это MapsFragment, а фрагмент 2 – ListFragment. Когда я запускаю приложение, я получаю местоположение пользователя (широта и долгота) из фрагмента 1. Что я также хочу сделать, так это передать эти данные во фрагмент 2, до того, как он начнет загружаться, прежде чем onCreateView будет вызван во фрагменте 2, поэтому я могу делать что-то с широтой и долготой, которые я получаю из фрагмента 1.

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

Некоторые из вещей, которые я пробовал, включают: это, это, это, это, это, это, это,это

Моя основная активность:

tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));

tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);

viewPager = findViewById(R.id.viewpager);
adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(2);

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
        // Step 2 - undo expand for collapsible toolbar
        appBarLayout.setExpanded(true);

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

Мой пейджерадаптер:

public class PagerAdapter extends FragmentStatePagerAdapter {
    private int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return new MapsFragment();
            case 1:
                return new ListFragment();
            case 2:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

Вот как я передаю широту и долготу в MainActivity после того, как получу их в свой MapsFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
    Intent intent = new Intent(getActivity().getBaseContext(), 
    MainActivity.class);
    intent.putExtra("latitude", latitude);
    intent.putExtra("longitude", longitude);
    getActivity().startActivity(intent);
...
}

Решение.
Оно основано на ответах и ​​комментариях. В моем фрагменте списка я вызывал метод только в том случае, если широта и долгота не пусты. И после того, как я получаю lat и lon, он вызывается снова, я использовал интерфейс и прослушиватель.

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


person Banana    schedule 22.06.2018    source источник
comment
Могу я спросить, почему вы используете PagerAdapter, если фрагмент не предназначен для взаимодействия до загрузки фрагмента 1? Разве это не возможность прочитать данные карты из базовой активности и зафиксировать фрагмент2, когда у вас есть доступные данные, и вы/пользователь хотите увидеть данные?   -  person Ezzy    schedule 22.06.2018
comment
@Ezzy Когда я впервые начал работать над этим, я не планировал это общение, поэтому я использовал адаптер пейджера ... К сожалению, если бы я изменил его, мне пришлось бы внести довольно много изменений сейчас, поэтому я ищу способ чтобы избежать этого, если это вообще возможно.   -  person Banana    schedule 22.06.2018
comment
звучит для меня так, как будто было бы лучше сделать это правильно, чем искать способы обойти это. Позже вы можете столкнуться с проблемами, которых можно было бы избежать, если бы вы просто переписали его.   -  person Ezzy    schedule 22.06.2018
comment
@Ezzy Я вроде как знаю об этом :( просто подумал попробовать и найти более простой способ, но если я не найду его сегодня вечером, я, вероятно, перепишу свой код на выходных :)   -  person Banana    schedule 22.06.2018


Ответы (2)


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

В любом случае для вашей проблемы у меня есть два решения.

1- Загружать данные во фрагмент 2 только тогда, когда фрагмент 2 виден пользователю. Для этого вы можете переопределить этот метод внутри Фрагмента 2.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
         //load data here
    }  
}

2- Первоначально заполните фрагмент 2 некоторыми фиктивными данными (или оставьте пустым) и обновляйте данные во фрагменте 2 всякий раз, когда фрагмент 1 заканчивает загрузку данных, отправляя широковещательное событие из фрагмента 1 во фрагмент 2.

person Community    schedule 22.06.2018
comment
Я попробую оба этих решения сегодня и дам вам знать, как только попробую. - person Banana; 22.06.2018

Создайте интерфейс, который будет реализовывать ваша активность, вызовите этот интерфейс из вашего MapsFragment, как только вы получите значения Longitude и Latitude. В ListFragment используйте метод setUserVisibleHint. Там получают значение от деятельности.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
     ////Use the longitude and latitude values. 
    }
person Ravi Rawal    schedule 22.06.2018
comment
Попробуйте создать метод в действии, скажем, getData(), затем вызовите метод из метода setUserVisibleHint, например ((MyActivity) getActivity()).getData(); - person Ravi Rawal; 22.06.2018
comment
Да, я пытался это сделать. Проблема, с которой я столкнулся, заключается в том, что я не могу получить эти данные для своего второго действия до того, как оно начнет загружаться. Я попробую еще раз сегодня вечером. - person Banana; 22.06.2018