Android TabHost切换激活Tab问题:setCurrentTab无效求替代方案
解决TabHost调用setCurrentTab无效的问题
我太懂你这种挫败感了——点击Marker后TabHost能正常显示,但setCurrentTab()就是纹丝不动,明明Stack Overflow上都说用这个方法,到自己这儿就失效了。别着急,这种情况大概率是控件加载时机或者实例类型的问题,咱们一步步排查解决:
先确保拿到的是真正的TabHost实例
你直接用findViewById(R.id.tab_host)返回的是View类型,虽然编译能过,但运行时可能因为类型不匹配导致方法调用失效。试试强转成TabHost:public void onMarkerClick(Marker marker) { findViewById(R.id.createNewMarker).setVisibility(View.GONE); TabHost tabHost = (TabHost) findViewById(R.id.tab_host); tabHost.setVisibility(View.VISIBLE); tabHost.setCurrentTab(1); }延迟执行Tab切换操作
调用setVisibility(View.VISIBLE)后,TabHost可能还没完成布局绘制,这时候切换Tab自然没反应。用post()把切换操作放到UI线程消息队列里,等控件完全渲染后再执行:public void onMarkerClick(Marker marker) { findViewById(R.id.createNewMarker).setVisibility(View.GONE); TabHost tabHost = (TabHost) findViewById(R.id.tab_host); tabHost.setVisibility(View.VISIBLE); // 延迟到TabHost绘制完成后切换 tabHost.post(new Runnable() { @Override public void run() { tabHost.setCurrentTab(1); } }); }检查TabHost的初始化是否完整
如果你的TabHost在onCreate里没有正确执行setup()或者添加Tab项,哪怕调用setCurrentTab()也不会有效果。确认初始化代码是完整的,比如:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); TabHost tabHost = (TabHost) findViewById(R.id.tab_host); tabHost.setup(); // 这一步很关键,不能少 // 添加你的Tab项 TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1"); tab1.setIndicator("标签1"); tab1.setContent(R.id.tab1_content); tabHost.addTab(tab1); TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2"); tab2.setIndicator("标签2"); tab2.setContent(R.id.tab2_content); tabHost.addTab(tab2); // 初始隐藏TabHost tabHost.setVisibility(View.GONE); }
先试试前两个方法,尤其是延迟执行的方案,基本能解决大部分“显示后切换Tab无效”的问题。
内容的提问来源于stack exchange,提问作者Timo Treichel
相关产品推荐
相关产品推荐

