Интерфейс во фрагменте в ViewPager.OnPageChangeListener - PullRequest
0 голосов
/ 02 декабря 2018

В моем viewpager я установил слушатель, из которого я вызываю методы из моего интерфейса во фрагментах вкладок.Но переменные в этой вкладке фрагменты в моих методах интерфейсов всегда возвращают нуль.Скажи мне почему ?ps извините за мой английский)

Родительский фрагмент:

public class MyFragment
extends Fragment {

protected Context mContext;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
}

@Override
public void onDetach() {
    super.onDetach();
    mContext = null;
} }

Фрагмент контейнера с помощью PagerAdapter:

public class FragmentContainer
    extends MyFragment {

private ViewPager viewPager;
private ViewPager.OnPageChangeListener onPageChangeListener;

public interface IPageSelected {
    void onPageSelected();
    void onPageUnselected();
}

public static FragmentContainer newInstance() {
    return new FragmentContainer();
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(
            R.layout.fragment_container, container, false);

    viewPager = view.findViewById(R.id.pager);
    PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager());
    viewPager.setAdapter(pagerAdapter);

    TabLayout tabLayout = view.findViewById(R.id.tab_layout);
    tabLayout.setupWithViewPager(viewPager);

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

        }

        @Override
        public void onPageSelected(int position) {
            for(int x = 0; x < pagerAdapter.getCount(); x++) {
                ((IPageSelected) pagerAdapter.getItem(x)).onPageUnselected();
            }

            ((IPageSelected) pagerAdapter.getItem(position)).onPageSelected();
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };

    viewPager.addOnPageChangeListener(onPageChangeListener);

    return view;
}

@Override
public void onResume() {
    super.onResume();
    setCurrentItem();
}

private void setCurrentItem() {
    viewPager.post(() -> {
        viewPager.setCurrentItem(0);
        onPageChangeListener.onPageSelected(0);
    });
}


class PagerAdapter
        extends FragmentStatePagerAdapter {

    PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return TestFragment1.newInstance();
            case 1:
                return TestFragment2.newInstance();
        }
        return null;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Tab1";
            case 1:
                return "Tab2";
            default:
                return null;
        }

    }
} }

Фрагменты табуляции.Вопрос: почему переменная mContext в интерфейсных методах всегда возвращает нуль?

public class TestFragment1
    extends MyFragment
    implements FragmentContainer.IPageSelected {

public static TestFragment1 newInstance() {
    return new TestFragment1();
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment1, container, false);
}

@Override
public void onPageSelected() {
    Log.d("myLog", "TestFragment1 onPageSelected: " + mContext); // WHY NULL ???
}

@Override
public void onPageUnselected() {
    Log.d("myLog", "TestFragment1 onPageUnselected: " + mContext); // WHY  NULL ???
} }

public class TestFragment2
    extends MyFragment
    implements FragmentContainer.IPageSelected {

public static TestFragment2 newInstance() {
    return new TestFragment2();
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment2, container, false);
}

@Override
public void onPageSelected() {
    Log.d("myLog", "TestFragment2 onPageSelected: " + mContext); // WHY NULL ???
}

@Override
public void onPageUnselected() {
    Log.d("myLog", "TestFragment2 onPageUnselected: " + mContext); // WHY  NULL ???
} }

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я нашел решение.
Класс адаптера.
Старый:

    class PagerAdapter
        extends FragmentStatePagerAdapter {

    PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return TestFragment1.newInstance();
            case 1:
                return TestFragment2.newInstance();
        }
        return null;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Tab1";
            case 1:
                return "Tab2";
            default:
                return null;
        }

    }
}

Новый:

    class PagerAdapter
        extends FragmentStatePagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

Инициализация адаптера.
Старый:

PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager());
viewPager.setAdapter(pagerAdapter);

Новое:

PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager());
pagerAdapter.addFragment(TestFragment1.newInstance(), "tab1");
pagerAdapter.addFragment(TestFragment2.newInstance(), "tab2");
viewPager.setAdapter(pagerAdapter);

А теперь новый вопрос: в чем разница с первым вариантом?
Теперь я инициализирую адаптер во фрагменте контейнера, это причина?
Почему не сделал?т работа при инициализации была в адаптере?

0 голосов
/ 02 декабря 2018

В вашем контейнере фрагмента:

PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager()); вот ошибка.

Чтобы прикрепить ваши дочерние фрагменты к вашему фрагменту контейнера, рассмотрите возможность передачи менеджера дочерних фрагментов getChildFragmentManager() к вашему адаптеру ViewPager. (сейчас ваши фрагменты привязаны к тому же уровню, что и ваш фрагмент контейнера) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...