获取选项卡 activity 的当前选定选项卡

Getting currently selected tab of a tabbed activity

所以我目前正在开发一个应用程序,它通过主 activity 中的卡片显示 json 文件。根据当前在我的选项卡 activity 中选择的选项卡,下载 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 作为参数工作,因为我在那里定义了它。但是,我无法为当前选定的选项卡或当前显示的片段创建 if 语句,因为

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

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

所以,我的问题是,

我该如何解决这个问题?

不要在 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;
    }

注意 MyFragmentBaseClass可以是所有片段实现的标记接口

使用上面的代码,您已经可以将每个片段映射到它的选项卡。

如果您正在使用 TabLayout,您现在可以使用 setOnTabSelectedListener 设置监听器并使用其方法之一 onTabSelected 来了解用户何时选择该选项卡并执行任何操作你要。