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

nmr*_*nmr 2 android android-widget

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

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

我错过了什么基本的东西?手动指定标签作为FrameLayout的XML子项是否正常?

nmr*_*nmr 6

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

  • TabHost.java(天真的IMO;))假定不同的选项卡附加到不同的内容视图.

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

  • 每次将TabSpec添加到TabHost时,TabHost都会切换到选项卡0.

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

为同一视图添加一堆选项卡时:

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

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

所以,要修复此调用:tabHost.getCurrentView().setVisibility(View.VISIBLE); ...添加所有选项卡后