【问题标题】:onTabChanged(first_page) is always called, is this expected behavior?onTabChanged(first_page) 总是被调用,这是预期的行为吗?
【发布时间】:2011-07-29 01:33:57
【问题描述】:

我有带有 3 个标签的 TabActivity。我将最后选择的页码保存到共享
偏好并将其恢复为 onResume 以致电tabHost.setCurrentTab()
但是onTabChanged()在选择第一个以外的时候被调用了两次
页。

  • 调用tabHost.setCurrentTab(0) 会使onTabChanged 调用一次。这是意料之中的。
  • 调用tabHost.setCurrentTab(1 or above) 会使onTabChanged 被调用两次,指定第一页和预期页。这不是我所期望的。

我在 OS2.3.3 上运行它。

这是预期的(设计的)行为吗? (我更喜欢 onTabChanged 只会被调用一次
防止对第一页进行不必要的处理。如果这是我需要考虑的设计行为
一些逻辑来忽略对onTabChanged.的不必要调用)

编辑

onCreate() 中的代码片段。

tabHost = getTabHost();
tabHost.setOnTabChangedListener(new TabChangedListener());
TabSpec firstTab = tabHost.newTabSpec("First")
    .setIndicator(firstButton)
    .setContent(R.id.first_content);
tabHost.addTab(firstTab);
TabSpec secondTab = tabHost.newTabSpec("Second")
    .setIndicator(secondButton)
    .setContent(R.id.second_content);
tabHost.addTab(secondTab);
TabSpec thirdTab = tabHost.newTabSpec("Third")
    .setIndicator(thirdButton)
    .setContent(R.id.third_content);
tabHost.addTab(thirdTab);

onResume() 中的代码。

int tabIndex = PreferenceManager.getDefaultSharedPreferences(this).getInt(ADDRESS_TAB_KEY,0);
tabHost.setCurrentTab(tabIndex);

还有 OnTabChangeListener。

class TabChangedListener implements OnTabChangeListener
{
    public void onTabChanged(String tabId)
    {
        Log.d(TAG,"onTabChanged " + tabId);

        if(tabId.equals("First") == true)
        {
            setupView(0);
        }
        else if(tabId.equals("Second") == true)
        {
            setupView(1);
        }
        else if(tabId.equals("Third") == true)
        {
            setupView(2);
        }
    }
}

我发现 onTabChanged() 在 onResume() 被调用之前被调用了!当我在调用 tabHost.addTab() 之后移动调用 tabHost.setOnTabChangedListener() 的行时,onTabChanged() 没有从 onCreate() 调用,这似乎可以理解。但是,在这种情况下,调用 tabHost.setCurrentTab(0) 根本不会调用 onTabChanged!这是荒唐的。所以我最终得到了这个解决方案。

1) 调用 tabHost.addTab() 后调用 tabHost.setOnTabChangedListener。
2) 扭曲的 onResume() 代码如下所示。

int tabIndex = PreferenceManager.getDefaultSharedPreferences(this).getInt(ADDRESS_TAB_KEY,0);
if(tabIndex == 0)
{
    setupView(0);   // setup view since onTabChanged won't be called
}
else
{
    tabHost.setCurrentTab(tabIndex);
}

现在我有了我的解决方案,问题是:

  • 这是预期的行为吗?
  • 有没有更好的解决方案?

感谢您的关注。

【问题讨论】:

  • 介意分享 onCreateonResume 方法只标签相关代码?
  • @Nikola,是的,我添加了代码片段。
  • 您已经修复了吗?还是需要帮助?
  • @Jeroen,正如您在我的问题中看到的那样,我有自己的解决方案,但没有回答我的问题。由于我仍在开发 Android 应用程序,我很高兴知道答案。
  • 我有类似的问题,在这里找到了解决方案stackoverflow.com/a/9896017/2596190这可能会有所帮助

标签: android android-tabhost tabactivity


【解决方案1】:

我们没有代码,所以很难说出确切的原因,但您很可能也从您的 onCreate 中调用了 setCurrentTab。当您回到活动时,您首先调用 onCreate 方法中的 setCurrentTab,然后调用 onResume 方法中的 setCurrentTab。

如果这不是问题,您将不得不分享一些代码以提供帮助。

实际上,您应该始终共享代码的相关部分,否则很难找到真正的问题。

【讨论】:

  • 我调查了更多。如果我在调用 tabHost.addTab 之前调用 tabHost.setOnTabChangedListener,则会调用 onTabChanged。如果索引不为 0,我会调用 ONE tabHost.setCurrentTab,它会再次调用 onTabChanged。我尝试编辑我的问题以添加代码片段。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2021-05-05
  • 2010-12-01
相关资源
最近更新 更多