因此,我尝试使用自定义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返回一个片段,但是当我调用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中浏览了调试器并观看了变量&#39; primaryFragment&#39;。当我调用mViewPager.instantiateItem(...)时,我得到一个实际的CustomFragment。问题是&#39; primaryFragment&#39;现在有一个空视图所以当我尝试访问视图来修改单元格时,我得到一个NullPointerException。
引起:java.lang.NullPointerException:尝试调用虚方法&#39; android.view.View android.view.View.findViewById(int)&#39;在空对象引用上
如何从此片段中获取视图?这甚至是从视图寻呼机获取片段的正确方法吗?我已经把头发撕掉了。我只是希望显示片段并修改其视图和子节点。
谢谢!
答案 0 :(得分:1)
FragmentStatePagerAdapter.instantiateItem()
通过调用Fragment
创建新的getItem()
。每次调用getItem()
时,CustomFragment
都会创建isntantiateItem()
的新实例。因此,当您调用CustomFragment
时,您将获得CustomFragment
的新实例,而不是适配器正在使用的实例。
您可能需要在适配器中存储CREATE EVENT `midnight_event`
ON SCHEDULE
EVERY 1 DAY STARTS '2015-10-10 00:00:00'
ON COMPLETION PRESERVE
DISABLE ON SLAVE
DO BEGIN
START TRANSACTION;
INSERT
INTO todays_table
VALUES (col, col, col, col)
SELECT col, col, col
FROM pending_table
WHERE time_stamp >= CURDATE()
AND time_stamp < CURDATE() + INTERVAL 1 DAY;
DELETE
FROM pending_table
WHERE time_stamp >= CURDATE()
AND time_stamp < CURDATE() + INTERVAL 1 DAY;
COMMIT;
END
的实例,并编写一个方法来通过索引获取它们。
我不确定您的完整用例,因此我无法建议您如何继续修改适配器。我的意思是我不知道你要访问哪个片段,如果它是当前显示的片段,或者远离屏幕的一个片段。