0

所以我目前正在开发一个应用程序,它通过主要活动中的卡片显示一个 json 文件。根据当前在我的选项卡式活动中选择的选项卡,下载 json 文件的方法决定下载哪个 json 文件(我传递一个整数并且该方法中有一个开关)。

这是方法:

Fragment.Downloadjson(rootview,integer,context);

现在,对于我的选项卡式活动,我有一个 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作为参数工作,因为我在那里定义了它。但是,我无法为当前选定的选项卡或当前显示的片段创建 if 语句,因为

a) 我不知道如何获取当前选择的标签

b)我不确定切换选项卡后它是否会再次下载json文件,因为毕竟If语句将在onCreateView中

所以,我的问题是,

我该如何解决?

4

1 回答 1

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来了解用户何时选择该选项卡并执行您想要的任何操作。

于 2016-04-05T17:57:38.923 回答