我一直在搜索,但我无法使其发挥作用。
我尝试使用制表符在viewpager中获取片段时遇到问题。
我已经实现了SparseArray,因为我在这里阅读了几个方法,但是我无法使其工作。
事情是每次我调用adapter.getRegisteredFragment(position)..我总是收到null,除非我在tabsStrip的onPageSelected事件中创建它,它有效..但我不想得到片段在那里。
这些是我的课程:
我的片段:
return $resource('app/prcs/rest/process/getERhHirachyInfo/:id', {}, {
'query': {
method: 'GET'
},
'get': {
method: 'GET'
}
});
我的适配器:
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);
}
}
每当我在我的活动中调用adapter.getRegisteredFragment(position)时它会崩溃,因为它总是返回null ..
我发誓,我一直在搜索,但我无法让它发挥作用。
非常感谢大家!
答案 0 :(得分:0)
我认为我的问题是我在我的活动的onCreate中调用了这个adapter.getRegisteredFragment(position),而在onCreate中,viewpager仍然没有完全加载,并且仍未实例化registeredFragments,因此列表仍然是空的..
如果在viewpager完全加载时将此调用移动到其他位置,它将起作用。
答案 1 :(得分:0)
registeredFragments
中的项目用instantiateItem()
方法初始化,应在绘制视图的过程中调用该方法。并且此绘制过程发生在onCreate()/ onResume()之后。
我不确定要通过在onCreate()中获取Fragment来做什么,但是通常这不是一个好主意,因为Fragment当时还没有初始化。如您所说,您应该访问onPageSelected()
中的片段。