所以我目前正在开发一个应用程序,它通过主要活动中的卡片显示一个json文件。根据我在选项卡式活动中当前选择的选项卡,下载json文件的方法决定下载哪个json文件(我传递一个整数,方法中有一个开关)。
以下是方法:
Fragment.Downloadjson(rootview,integer,context);
现在,对于我的标签Activity,我有一个SectionsPagerAdapter,它有通常的东西:getItem,getCount和getPageTitle。
在getItem中我创建了我的新片段:
@Override
public Fragment getItem(int position) {
View v1 = getWindow().getDecorView().getRootView();
switch (position) {
case 0:
//Fragment.Download(v1,0,getApplicationContext());
return new Fragment().f(Fragment.page.TODAY);
case 1:
//Fragment.Download(v1,1,getApplicationContext());
return new Fragment().f(Fragment.page.TOMORROW);
default:
return new Fragment();
}
}
例外:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
我发现此错误的来源是我方法中的rootview参数,因为它在onCreateView中以rootView
作为参数,因为我在那里定义它。 Hovewer,我不能为当前选中的标签或当前显示的片段制作if语句,因为
a)我不知道如何获取当前选中的标签
b)我不确定在切换标签后会再次下载json文件,因为毕竟,If语句将在onCreateView中
所以,我的问题是,
我该如何解决这个问题?
答案 0 :(得分:1)
不要在getItem()
方法中执行此操作。在getItem
中只需创建片段。
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MyFragment0();
case 1:
return new MyFragment1();
case 2:
return new MyFragment2();
}
return null;
}
覆盖方法instantiateItem
并在其中保留片段及其位置的地图:
private ArrayMap<Integer, MyFragmentBaseClass> mPagerFragmentMap = new ArrayMap<>();
@Override
public Object instantiateItem(ViewGroup container, int position) {
MyFragmentBaseClass fragment = (MyFragmentBaseClass) super.instantiateItem(container, position);
mPagerFragmentMap.put(position, fragment);
return fragment;
}
note MyFragmentBaseClass
可以是所有片段实现的标记接口。
使用上面的代码,您可以将每个片段映射到其选项卡。
如果您正在使用TabLayout
,现在可以使用setOnTabSelectedListener
设置一个侦听器,并使用其中一种方法onTabSelected
来了解用户何时选择该标签并执行任何操作你想要的。