Android fragments 使用getRegisteredFragment在Android的ViewPager中获取片段将返回null

Android fragments 使用getRegisteredFragment在Android的ViewPager中获取片段将返回null,android-fragments,android-viewpager,fragmentpageradapter,Android Fragments,Android Viewpager,Fragmentpageradapter,我一直在寻找,但我不能让它工作 我在尝试使用tabstrip在viewpager中获取片段时遇到问题 我已经实现了一个SparseArray,正如我在这里读到的,还有我在这里找到的几个方法,但我无法让它工作 问题是每次我调用adapter.getRegisteredFragment(位置)时。。我总是收到null,除非我在tabsStrip的onPageSelected事件中设置了null,否则它会工作。。但我不想把碎片拿到那里 这些是我的课程: 我的片段: public class WeekF

我一直在寻找,但我不能让它工作

我在尝试使用tabstrip在viewpager中获取片段时遇到问题

我已经实现了一个SparseArray,正如我在这里读到的,还有我在这里找到的几个方法,但我无法让它工作

问题是每次我调用adapter.getRegisteredFragment(位置)时。。我总是收到null,除非我在tabsStrip的onPageSelected事件中设置了null,否则它会工作。。但我不想把碎片拿到那里

这些是我的课程:

我的片段:

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);
    }
}
公共类WeekaAdapter扩展了FragmentPagerAdapter
{
日历校准;
语境;
SparseArray注册碎片;
私有字符串[]标题=新字符串[6];
公共WeekAdapter(FragmentManager格式,上下文)
{
超级(fm);
registeredFragments=新SparseArray();
this.context=上下文;
fillTitles();
}
私人所有权()
{
//填写标题
}
@凌驾
公共字符序列getPageTitle(int位置)
{
返回标题[职位];
}
@凌驾
public int getCount()
{
返回标题。长度;
}
@凌驾
公共片段getItem(int位置)
{
返回WeekFragment.newInstance(位置);
}
@凌驾
公共对象实例化项(视图组容器,int位置){
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象){
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getRegisteredFragment(int位置){
返回registeredFragments.get(位置);
}
}
我的活动:

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();
    }


}
公共类MyActivity扩展了FragmentActivity
{
专用页滑动选项卡;
私人寻呼机;
专用WeekAdapter适配器;
私人列表listDayResumesItems;
私人用户u;
私有视图mProgressView;
私有视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rota2);
mProgressView=findviewbyd(R.id.view\u进度);
mRotaView=findviewbyd(R.id.view\u rota);
this.u=this.getIntent().getExtras().getParcelable(getString(R.string.parcel_用户));
//初始化ViewPager并设置适配器
pager=(ViewPager)findViewById(R.id.pager);
adapter=newweekAdapter(getSupportFragmentManager(),getApplicationContext());
寻呼机设置适配器(适配器);
//将选项卡绑定到ViewPager
tabs=(PagerSlidingTabStrip)findViewById(R.id.tabs);
tabs.setViewPager(寻呼机);
tabs.setOnPageChangeListener(新建ViewPager.OnPageChangeListener())
{
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels)
{
WeekFragment f=(WeekFragment)adapter.getRegisteredFragment(week);
//这里,f不是空的。这里我可以工作,但我不想。
}
@凌驾
已选择页面上的公共无效(内部位置)
{
}
@凌驾
公共无效onPageScrollStateChanged(int状态)
{
}
});
WeekFragment f=(WeekFragment)adapter.getRegisteredFragment(week);
//做些事情,这里,f是空的,我不能工作。
}
@凌驾
受保护的void onResume()
{
super.onResume();
getList();
}
}
每次我在活动上调用adapter.getRegisteredFragment(位置)时,它都会崩溃,因为它总是返回null

我发誓我已经搜索了很多次了,但是我无法让它工作


非常感谢大家

我想我的问题是,我在活动的onCreate中调用了这个适配器.getRegisteredFragment(position),在onCreate中,viewpager仍然没有完全加载,RegisteredFragment也没有实例化,因此列表仍然为空


如果在viewpager完全加载时将此调用移动到另一个位置,则它将工作。

registeredFragments
中的项在
instantiateItem()
方法中初始化,该方法应在工程视图过程中调用。这个绘图过程发生在onCreate()/onResume()之后。
我不确定通过在onCreate()中获取片段要做什么,但一般来说这不是一个好主意,因为此时片段还没有初始化。正如您所说,您应该在
onPageSelected()
中访问该片段。

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