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
的实例存储在您的适配器中,并编写一个方法通过索引获取它们。
我不确定您的完整用例,因此我无法就您如何继续修改适配器提供建议。我的意思是我不知道你想访问哪个片段,如果它是当前显示的片段,或者是远离屏幕的某个遥远的片段。
所以我正在尝试使用自定义 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
的实例存储在您的适配器中,并编写一个方法通过索引获取它们。
我不确定您的完整用例,因此我无法就您如何继续修改适配器提供建议。我的意思是我不知道你想访问哪个片段,如果它是当前显示的片段,或者是远离屏幕的某个遥远的片段。