获取选项卡式活动的当前选定选项卡

Posted

技术标签:

【中文标题】获取选项卡式活动的当前选定选项卡【英文标题】:Getting currently selected tab of a tabbed activity 【发布时间】:2016-04-05 17:10:04 【问题描述】:

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

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

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

所以,我的问题是,

我该如何解决?

【问题讨论】:

查看此链接以获取当前标签***.com/questions/3583405/… @BrahmamYamani 我没有选项卡活动,我使用 android studio 中预先构建的 选项卡活动。因此,我无法使用 Tabhost。 【参考方案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;
    

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

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

如果您使用TabLayout,您现在可以使用setOnTabSelectedListener 设置侦听器,并使用其中一种方法onTabSelected 了解用户何时选择该选项卡并执行您想要的任何操作。

【讨论】:

视情况而定。你用什么来实现标签?您唯一需要的是能够检测选项卡选择。 我的 Android Studio 使用视图寻呼机创建了一个“选项卡式活动”(与我之前假设的相同)。我没用过TabListener,你指的是ActionBar.TablListener吗?如果是这样,它有onTabSelected 的方法(请参阅developer.android.com/reference/android/app/…) 如果 onTabSelected 方法在具有 rootview 的类中,只需将其设为类字段,以便您可以访问它。 你能发布一些代码吗?我不明白这是什么:D 私有mPagerFragmentMap 应该是您的MainActivity 的一个字段。每个片段都应该保留一份根视图的副本作为片段字段。你可以实现一个getter方法getRootView。最后,在onTabSelected 中使用mPagerFragmentMap.get(tab.getPosition()).getRootView() 获取片段根视图并随意使用。

以上是关于获取选项卡式活动的当前选定选项卡的主要内容,如果未能解决你的问题,请参考以下文章

WPF 选项卡控件:如何获取当前选定的选项卡?

jQuery UI 选项卡 - 如何获取当前选定的选项卡索引

Android - 选项卡式片段

在选项卡式应用程序中的何处放置位置代码?

在 Oracle 表单中的选项卡之间移动项目

如何在选项卡面板中获取活动选项卡索引?