1

所以我試圖用自定義FragmentStatePagerAdapter實現ViewPager。在我的MainActivity中,我試圖訪問正在顯示的片段,以便我可以修改片段視圖內的子項。Android:從PagerAdapter獲取片段

這裏是定製的片斷:

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中的調試運行,並觀看了變量 'primaryFragment'。當我調用mViewPager.instantiateItem(...)時,我得到一個實際的CustomFragment。問題是'primaryFragment'現在有一個空視圖,所以當我嘗試訪問視圖來修改單元格時,我得到一個NullPointerException。

所致:顯示java.lang.NullPointerException:嘗試上的空對象引用

如何調用虛擬方法android.view.View android.view.View.findViewById(INT)'我從這個片段中獲得了觀點?這甚至是從視圖傳呼機獲取片段的正確方法嗎?這件事我一直在抓我的頭髮。我只想得到正在顯示的片段並修改其視圖和孩子。

謝謝!

回答

1

FragmentStatePagerAdapter.instantiateItem()通過致電getItem()創建新的Fragment。每次調用時,您的getItem()都會創建一個新的CustomFragment實例。因此,當您撥打isntantiateItem()時,您將獲得CustomFragment的新實例,而不是適配器正在使用的實例。

您可能需要將CustomFragment的實例存儲在適配器中,然後編寫一個方法來按索引獲取它們。

我不確定您的完整用例,因此我無法建議您如何繼續修改適配器。我的意思是我不知道你想要訪問哪個片段,如果它是當前顯示的片段或遠離屏幕的某個片段。