为什么我的TabHost的FrameLayout唯一的孩子装载了visibility = View.GONE?

时间:2011-02-24 18:50:15

标签: android android-widget

我正在使用TabHost来渲染一些标签。在XML定义中,一切都设置为〜通常,RelativeLayout是TabHost的FrameLayout的唯一子节点。

奇怪的是,相对布局总是加载为View.GONE。在XML文件中设置RelativeLayout的visibiltiy不会改变这一点。在onCreate期间调用.setVisibility手动使RelativeLayout可见,但感觉不对。在选项卡之间切换也会使RelativeLayout再次可见。

我错过了一些基本的东西吗?将标签手动指定为FrameLayout的XML子项是否正常?

1 个答案:

答案 0 :(得分:6)

我最终花了一些时间阅读TabHost.java并发现了正在发生的事情。

  • TabHost.java(天真的IMO;))假设不同的标签被附加到不同的内容视图。

  • 每次将内容视图添加到TabSpec时,视图的可见性都将设置为GONE。

  • 每次将TabSpec添加到TabHost时,TabHost都会切换到标签0.

  • 每当调用setCurrentTab时,当且仅当新选择的选项卡不是当前选项卡时,该选项卡的视图的可见性才设置为可见。

为同一视图添加一堆标签时:

  • 首先添加视图并将其可见性设置为GONE,
  • 然后TabHost切换到选项卡0并将视图的vis设置为VISIBLE,
  • 然后添加下一个标签,其视图(同一视图!)的vis设置为GONE,
  • 然后TabHost切换到标签0,这是一个~noop,因为之前选择了标签0,因此视图没有切换回可见。

所以这是因为对多个标签的内容使用相同的视图。

所以,要修复此调用: tabHost.getCurrentView()。setVisibility(View.VISIBLE); ...添加所有标签后