繁体   English   中英

ViewPager.OnPageChangeListener中的片段接口

[英]Interface in fragment in ViewPager.OnPageChangeListener

在我的viewpager中,我设置了侦听器,从该侦听器中,我在选项卡片段中从界面调用方法。 但是我的接口方法中此选项卡片段中的变量始终返回null。 告诉我为什么 ? 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总是返回null?

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 ???
} }

在您的片段容器中:

PagerAdapter pagerAdapter = new PagerAdapter(getFragmentManager()); 这是错。

为了将子片段附加到容器片段,请考虑将子片段管理器 getChildFragmentManager()传递到viewpager适配器。 (现在,您的片段与容器片段连接到同一级别)

我找到了解决方案。
适配器类。
旧:

    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);

现在出现了一个新问题:第一种选择的区别是什么?
现在我在容器片段中初始化适配器,这是原因吗?
为什么在适配器中初始化时不起作用?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM