0

我一直在寻找很多,我无法使它工作。使用getRegisteredFragment在Android中的ViewPager中获取片段返回null

我有一个问题,试图用tabstrip在viewpager中获取片段。

我已经实现了一个SparseArray,因为我在这里读到了几个我在这里找到的方法,但是我无法使它工作。

事情是,每次我调用adapter.getRegisteredFragment(位置)..我总是会收到空,除非我在tabsStrip的onPageSelected事件内,它有效..但我不想要的碎片那里。

这些都是我的课:

我的片段:

public class WeekFragment extends Fragment implements View.OnClickListener 
{ 
    private static final String ARG_POSITION = "position"; 

    private int position; 

    private LinearLayout[] btns; 

    public static WeekFragment newInstance(int position) { 
     WeekFragment f = new WeekFragment(); 
     Bundle b = new Bundle(); 
     b.putInt(ARG_POSITION, position); 
     f.setArguments(b); 
     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     position = getArguments().getInt(ARG_POSITION); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) 
    { 
     super.onViewCreated(view, savedInstanceState); 
     fillFragment(); 
    } 

    private void fillFragment() 
    { 
     // Irrelevant stuff.. 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) 
    { 
     return inflater.inflate(R.layout.week_fragment, container, false); 
    } 

    @Override 
    public void onClick(View v) 
    { 
     // Irrelevant stuff 
    } 

    public LinearLayout[] getBtns() 
    { 
     return btns; 
    } 

    public void setBtns(LinearLayout[] btns) 
    { 
     this.btns = btns; 
    } 
} 

我的适配器:

public class WeekAdapter extends FragmentPagerAdapter 
{ 
    Calendar cal; 
    Context context; 
    SparseArray<Fragment> registeredFragments; 

    private String[] TITLES = new String[6]; 

    public WeekAdapter(FragmentManager fm, Context context) 
    { 
     super(fm); 
     registeredFragments = new SparseArray<>(); 
     this.context = context; 
     fillTitles(); 
    } 

    private void fillTitles() 
    { 
     // Fill titles 
    } 


    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return TITLES[position]; 
    } 

    @Override 
    public int getCount() 
    { 
     return TITLES.length; 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     return WeekFragment.newInstance(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     registeredFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 

    public Fragment getRegisteredFragment(int position) { 
     return registeredFragments.get(position); 
    } 
} 

和我的活动:

public class MyActivity extends FragmentActivity 
{ 

    private PagerSlidingTabStrip tabs; 
    private ViewPager pager; 
    private WeekAdapter adapter; 
    private List<DayResumeItem> listDayResumesItems; 
    private User u; 
    private View mProgressView; 
    private View mRotaView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_rota2); 

     mProgressView = findViewById(R.id.view_progress); 
     mRotaView = findViewById(R.id.view_rota); 

     this.u = this.getIntent().getExtras().getParcelable(getString(R.string.parcel_user)); 

     // Initialize the ViewPager and set an adapter 
     pager = (ViewPager) findViewById(R.id.pager); 
     adapter = new WeekAdapter(getSupportFragmentManager(), getApplicationContext()); 
     pager.setAdapter(adapter); 

     // Bind the tabs to the ViewPager 
     tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
     tabs.setViewPager(pager); 
     tabs.setOnPageChangeListener(new ViewPager.OnPageChangeListener() 
     { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
      { 
       WeekFragment f = (WeekFragment)adapter.getRegisteredFragment(week); 
       // Do stuff.. Here, f is not null. Here I can work, but I don't want to. 
      } 

      @Override 
      public void onPageSelected(int position) 
      { 

      } 

      @Override 
      public void onPageScrollStateChanged(int state) 
      { 

      } 
     }); 

     WeekFragment f = (WeekFragment)adapter.getRegisteredFragment(week); 
     // Do stuff.. Here, f is null and I can't work. 

    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     getList(); 
    } 


} 

是,每次我打电话适配器.getRegisteredFragm ent(位置)在我的活动,它崩溃,因为它总是返回空..

我发誓,我一直在寻找很多,但我无法使它的工作。

非常感谢大家!

回答

0

我认为我的问题是我在我的activity的onCreate中调用了这个adapter.getRegisteredFragment(position),而在onCreate中,viewpager仍然没有完全加载,并且registeredFragments也没有实例化,所以列表仍然是空的..

如果您在viewpager完全加载时将此调用移动到另一个地方,它将起作用。

+0

这很奇怪,但即使在onResume中调用它仍会返回null。 – Stan