在 Android 的 TabHost 中隐藏选项卡

Posted

技术标签:

【中文标题】在 Android 的 TabHost 中隐藏选项卡【英文标题】:Hide a tab in the TabHost in Android 【发布时间】:2012-06-05 22:03:06 【问题描述】:
if( ......)
    


        tabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE);
                    //to hide the first tab in the TabHost

    

这段代码有什么问题吗?当我在 onCreate() 方法中添加此代码时,应用程序崩溃.. 有什么想法吗?

我的日志猫:

05-31 22:03:38.471: E/androidRuntime(598): Caused by: java.lang.NullPointerException 05-31 22:03:38.471: E/AndroidRuntime(598): at swayam.dev.mushtouch.MushTouchActivity.setVisibilityControls(MushTouchActivity.j‌​ava:75) 05-31 22:03:38.471: E/AndroidRuntime(598): at swayam.dev.mushtouch.MushTouchActivity.onCreate(MushTouchActivity.java:220) 05-31 22:03:38.471: E/AndroidRuntime(598): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-31 22:03:38.471: E/AndroidRuntime(598): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

也试过这个代码。还是老是崩溃。

getTabHost().getTabWidget().removeViewAt(0);

【问题讨论】:

不要太明显,但如果您有机会在主题行和标签中提及您所询问的语言或开发环境,您就会得到答案。跨度> 好吧,我已将其标记为“Android”。反正你说完我也换了话题。 你能发布堆栈跟踪吗?另外,您是否在代码中引用 TabHost ?如果不是,那是你的问题。 @wdziemia 引用 TabHost 是什么意思? tabHost = (TabHost)findViewById(android.R.id.tabhost);这个?? 05-31 22:03:38.471: E/AndroidRuntime(598): 由: java.lang.NullPointerException 05-31 22:03:38.471: E/AndroidRuntime(598): at swayam .dev.mushtouch.MushTouchActivity.setVisibilityControls(MushTouchActivity.java:75) 05-31 22:03:38.471: E/AndroidRuntime(598): at swayam.dev.mushtouch.MushTouchActivity.onCreate(MushTouchActivity.java:220) 05- 31 22:03:38.471: E/AndroidRuntime(598): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-31 22:03:38.471: E/AndroidRuntime(598): 在 android.app。 ActivityThread.performLaunchActivity(ActivityThread.java:1611) 【参考方案1】:

我的回答会太长,所以我把它放在一个答案中。

到目前为止你已经

TabHost  tabHost = (TabHost)findViewById(android.R.id.tabhost);
tabHost.getTabWidget().getChildAt(0).setVisibility(View.GONE);

您得到一个 NullPointerException,这意味着每当您使用该行代码时,您都在尝试更改屏幕上不存在的东西,或者可能是屏幕外的东西。

检查 R 的导入语句。

在您的包装声明下方,您应该有以下内容:

import your.package.R;

而不是

import android.R;

一旦修复,当您引用标签主机时,请使用以下内容:

TabHost  tabHost = (TabHost)findViewById(R.id.tabhost);

如果这不起作用,请确保 tabhost 实际上在屏幕上,并且您不在单独的活动中。

【讨论】:

这是我的 TabHost XML 的代码。 schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_ android:layout_> 所以如果我将java代码更改为R.id。 tabhost,然后它会在 java 代码中显示一个错误,指出找不到资源。我还尝试将 XML 中 TabHost 的 id 更改为 @+id/tabhost 而不是 @android:id/tabhost,但这会导致其他 RuntimeExceptions 说 tabhost 的名称应该是 abdroid.R.id.tabhost。 你能说出别的名字吗,比如@+id/tabhost1?然后在代码中使用 R.id.tabhost1? 似乎没有其他任何工作。如果我给其他任何东西,那么应用程序力甚至在开始之前就关闭了。 好吧,我修好了!现在就像一个魅力。你的代码很棒。感谢@wdziemia 的帮助 @swayam 没问题!很高兴这是问题所在,如果您能将其标记为答案,我将不胜感激!【参考方案2】:

如果你想隐藏标签,你应该使用:

getChildTabViewAt() 而不是 getChildAt()

所以你的代码应该是这样的:

  tabHost.getTabWidget().getChildTabViewAt(0).setVisibility(View.GONE);

【讨论】:

它对我来说很好,所以也许还有其他问题。堆栈跟踪可能会有所帮助:) 我在同一位置使用 Toast,它工作正常。但是,一旦我用这段代码替换 Toast,应用程序就会崩溃。 您是否为您的 TabHost 对象设置了任何 TabSpec? TabHost.TabSpec 规范 = getTabHost().newTabSpec("tag1"); spec.setContent(R.id.control); spec.setIndicator("控制", getResources().getDrawable(R.drawable.control)); getTabHost().addTab(spec); 非常适合我,我的标签内容扩展了 LinearLayout,我通过mTabHost.addTab(mTabHost.newTabSpec("trasy").setIndicator("Trasy", getResources().getDrawable(R.drawable.drogo)).setContent(R.id.tracklist));添加它们

以上是关于在 Android 的 TabHost 中隐藏选项卡的主要内容,如果未能解决你的问题,请参考以下文章

转载《Android-TabHost 选项卡功能用法详解》

Android乐学成语之TabHost介绍及使用Fragment 替换 TabActivity

Android学习笔记---使用TabHost实现微信底部导航栏效果

Android 在 Fragment 中添加选项卡

使用 tabhost 中的每个选项卡设置 axml 布局:Xamarin Android

Android 片段,在 TabHost 中找不到 id 的视图