Android fragments 使用getRegisteredFragment在Android的ViewPager中获取片段将返回null
我一直在寻找,但我不能让它工作 我在尝试使用tabstrip在viewpager中获取片段时遇到问题 我已经实现了一个SparseArray,正如我在这里读到的,还有我在这里找到的几个方法,但我无法让它工作 问题是每次我调用adapter.getRegisteredFragment(位置)时。。我总是收到null,除非我在tabsStrip的onPageSelected事件中设置了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
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。