Перезапуск действия на конкретном фрагменте при использовании отдельного FragmentPagerAdapter - PullRequest
0 голосов
/ 01 сентября 2018

Фон
У меня есть приложение для Android с использованием фрагментов. Я использую отдельный FragmentPagerAdapter (т.е. как отдельный класс, вне MainActivity).

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.MainActivity);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(mViewPager);

}

SectionsPagerAdapter.java

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return new frag1();
        case 1:
            return new frag2();
        case 2:
            return new frag3();
        case 3:
            return new frag4();
        case 4:
            return new frag5();
        default:
            return null;
    }
}

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

@Override
public CharSequence getPageTitle(int position) {
    switch (position) {
        case 0:
            return "Name1";
        case 1:
            return "Name2";
        case 2:
            return "Name3";
        case 3:
            return "Name4";
        case 4:
            return "Name5";
    }
    return null;
}

Выпуск
Мне нужно обновить вид, скажем, фрагмента № 3 из фрагмента № 2 (конечная цель состоит в том, чтобы изменения, которые пользователь инициирует во фрагменте № 2, были видны, как только пользователь переходит к фрагменту № 3. У меня есть попытался отсоединить / прикрепить сам фрагмент # 3, как только он будет виден, например:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
    }

К сожалению, а) это приводит к снижению производительности, так как во время навигации возникает «заикание»; б) это не работает надежно. Некоторые вещи (тексты некоторых кнопок) не обновляются, по некоторым причинам я не могу понять.

В любом случае я обнаружил, что единственный 100% надежный метод принудительного обновления / перерисовки - это перезапустить действие (например, с помощью onClickListener на кнопке Сохранить, которую пользователь должен нажать на предыдущем фрагменте, # 2). ). Но это перезапускает действие на фрагменте # 1

Мой вопрос
Как я могу перезапустить действие на этом конкретном фрагменте (# 3), учитывая тот факт, что я использую отдельный FragmentPagerAdapter?

Я изучил несколько других вопросов / ответов, например: https://stackoverflow.com/a/36064344
но как я могу реализовать что-то вроде этого (добавление дополнительных данных к вызову намерения), когда FragmentPagerAdapter находится в отдельном классе? Кроме того, есть ли что-то еще, что я могу сделать, чтобы обновить вид фрагмента?

Если вам нужна дополнительная информация или код, дайте мне знать, и я был бы рад добавить разъяснение.

EDIT: Мне удалось найти другое решение, которое до сих пор, кажется, работает как задумано. Я добавил следующий код в onClickListener кнопки Сохранить на фрагменте # 2

    frag3 f3 = new frag3();
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragmentContainer, f3);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();

Тем не менее, я все еще интересуюсь моим первоначальным вопросом (как начать действие с определенного фрагмента при использовании отдельного FragmentPagerAdapter), так что если у вас есть какие-либо идеи по этому поводу, я все уши.

1 Ответ

0 голосов
/ 05 сентября 2018

Ну, не все так просто ...
this.recreate(); не только возобновляет действие, но также запоминает позицию фрагмента.

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

  • Сначала объявите действие, которое содержит рассматриваемый фрагмент. Э.Г.

    public class frag1 extends Fragment {
    ...
    Activity mactivity;
    
    @Override
    public void onAttach(Activity MainActivity) {
        super.onAttach(MainActivity);
        mactivity = MainActivity; 
    }
    
  • Тогда вместо getActivity().recreate(); просто используйте mactivity.recreate();
...