【问题标题】:Switching between fragmentTabs giving unexpected results在 fragmentTabs 之间切换会产生意想不到的结果
【发布时间】:2012-05-22 23:02:54
【问题描述】:

我正在尝试按照http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.html 中的说明实现 FragmentTabs。在我这样做之前一切都很顺利:

我从一个标签开始了许多不同的片段,例如:

tab1-->fragment1--->fragment2--->fragment3

tab2

但是当我切换到 tab2 并再次回到 tab1 时,我得到的是 fragment1 屏幕而不是 fragment3(即我在第一个标签中有 3 个片段,而我在第三个片段上,我在切换到第二个标签后再次出现在第一个标签上,我被带到第 1 个片段而不是第 3 个片段)..谁能告诉我可能是什么问题?

        @Override
        public void onTabChanged(String tabId) {
            TabInfo newTab = mTabs.get(tabId);
            if (mLastTab != newTab) {
                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
                if (mLastTab != null) {
                    if (mLastTab.fragment != null) {
                        ft.detach(mLastTab.fragment);
                    }
                }
                if (newTab != null) {
                    if (newTab.fragment == null) {
                        newTab.fragment = Fragment.instantiate(mActivity,
                                newTab.clss.getName(), newTab.args);
                        ft.add(mContainerId, newTab.fragment, newTab.tag);
                    } else {
                        ft.attach(newTab.fragment);
                    }
                }

                mLastTab = newTab;
                ft.commit();
                mActivity.getSupportFragmentManager().executePendingTransactions();
            }
        }

当我评论 attach() 和 detatch() 时,我明白了:

【问题讨论】:

  • 您在这里没有太多信息可以让我们找到问题所在。如果有的话,请将代码粘贴到您要设置 TabHost/TabManager 的位置,并将选项卡添加到其中,如示例所示。
  • 我指的是我在问题中给出的链接。
  • 我以前亲自使用过该示例源,并且它可以正常工作。我要求您使用它,因为这可能是您的实施中的一个问题。
  • 如果你用过这个例子,那么你一定知道我们必须在添加标签的地方给出片段类的名称。我也在这样做..现在从那个片段类开始我开始一个新的片段..现在的问题是,当我在让我们说第三个片段并且我切换到其他选项卡然后再次来到第一个选项卡..我被转发到不应该发生的片段1屏幕时,它应该只保留在当前选项卡上..我认为必须修改 onTabChanged() ..你能告诉我如何从我切换到第二个选项卡的地方保持在 sameFragment 上..?
  • 问题区域是您的onTabChanged(String tabId) 覆盖。将此代码添加到您的帖子中。

标签: android android-fragments android-tabhost android-tabs


【解决方案1】:

如果没有更多细节,很难说具体出了什么问题。但是,我可以从个人经验中说,当我第一次必须实现片段选项卡时,我经历了很多糟糕的教程,然后才找到了可行的方法。终于对我有意义的教程在这里: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

另外,还有一些 Github 源代码: https://github.com/mitchwongho/Andy/tree/master/Andy/src/com/andy/fragments/tabs

【讨论】:

  • 嘿,该教程对我帮助很大,但我正在寻找其他东西。在您建议的教程中,每个选项卡只有一个片段。在我的情况下,我在第一个选项卡中有 3 个片段,当我在第 3 个片段上时,我在切换到不同的选项卡后再次进入第一个选项卡,我被带到第一个片段而不是第 3 个片段。希望我没有让你感到困惑。
【解决方案2】:

更新:

我建议您保留onTabChanged的原始代码,并使用addToBackStack方法来维护片段的遍历状态。从一个片段转到下一个片段时调用addToBackStack,例如adding 或replaceing 片段。

同时更改TabInfo.fragment 引用以反映选项卡内片段之间的转换。


不要在每次更改选项卡时附加和分离。

   @Override
    public void onTabChanged(String tabId) {
        TabInfo newTab = mTabs.get(tabId);
        if (mLastTab != newTab) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

            if (newTab != null) {
                if (newTab.fragment == null) {
                    newTab.fragment = Fragment.instantiate(mActivity,
                            newTab.clss.getName(), newTab.args);
                    ft.add(mContainerId, newTab.fragment, newTab.tag);
                } else {
                    ft.replace(mContainerId, newTab.fragment, newTab.tag);
                } 
            }
            mLastTab = newTab;
            ft.commit();
            mActivity.getSupportFragmentManager().executePendingTransactions();
        }
    }

【讨论】:

  • 通过评论..两个选项卡的内容混合到一个屏幕中
  • 混入一屏是什么意思?如何
  • 要放置此片段的容器的标识符。
  • 我更新了问题,看到两个标签合并为一个。
  • 你在哪里打电话给addToBackStack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多