Android: 从 PagerAdapter 获取片段

Android: Get fragment from PagerAdapter

所以我正在尝试使用自定义 FragmentStatePagerAdapter 实现 ViewPager。在我的 MainActivity 中,我试图访问正在显示的片段,以便我可以修改该片段视图内的子项。

这是自定义片段:

public class CustomFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_custom, container, false);
        return rootView;
    }
}

这是 FragmentStatePagerAdapter:

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    private int NUM_PAGES;

    public ScreenSlidePagerAdapter(FragmentManager fm, int NUM_PAGES) {
       super(fm);
       this.NUM_PAGES = NUM_PAGES;
    }

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

    @Override
    public Fragment getItem(int position) {
        return new CustomFragment();
    }

}

这是 MainActivity 中的重要部分。这是我尝试获取寻呼机适配器当前显示的片段的地方。 mPagerAdapter.instantiateItem returns 一个片段,但是当我调用 primaryFragment.getView() 时,我得到一个空指针。

    moveViewPagerToIndex(); // Move the view pager to NUM_PAGES / 2 to start
    primaryFragment = (CustomFragment) mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem());
    updateFragment();

updateFragment():

    ArrayList<Button> arrayList = Utility.getCellsFromCalendarFragment(primaryFragment.getView());
    for (int i = 0; i < arrayList.size(); i++) {
         // do stuff with all the cells
    }

Utility.getCellsFromCalendarFragment(查看rootView)

public static ArrayList<Button> getCellsFromCalendarFragment(View rootView) {
    ArrayList<Button> cellList = new ArrayList<>();
    cellList.add((Button) rootView.findViewById(R.id.cell00));
    cellList.add((Button) rootView.findViewById(R.id.cell01));
    cellList.add((Button) rootView.findViewById(R.id.cell02));
    // There are a lot more than 3 cells... There's roughly 50 cells.
    return cellList
}

我 运行 通过 Android Studio 中的调试器观察了变量 'primaryFragment'。当我调用 mViewPager.instantiateItem(...) 时,我得到了一个实际的 CustomFragment。问题是 'primaryFragment' 现在有一个空视图,所以当我尝试访问该视图以修改单元格时,我得到一个 NullPointerException。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

如何从这个片段中获取视图?这甚至是从视图寻呼机获取片段的正确方法吗?我一直在为此焦头烂额。我只想获取正在显示的片段并修改其视图和子项。

谢谢!

FragmentStatePagerAdapter.instantiateItem() 通过调用 getItem() 创建新的 Fragment。您的 getItem() 每次被调用时都会创建一个 CustomFragment 的新实例。因此,当您调用 isntantiateItem() 时,您将获得 CustomFragment 的一个新实例,而不是适配器正在使用的实例。

您可能需要将 CustomFragment 的实例存储在您的适配器中,并编写一个方法通过索引获取它们。

我不确定您的完整用例,因此我无法就您如何继续修改适配器提供建议。我的意思是我不知道你想访问哪个片段,如果它是当前显示的片段,或者是远离屏幕的某个遥远的片段。