Android TabHost.addTab -> 空指针异常

12

这是我的代码:

    public class Main extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            TabHost tabHost = new TabHost(this);

            TabHost.TabSpec tab = tabHost.newTabSpec("tab1");
            tab.setIndicator("Tab 1");
            tab.setContent(new TabHost.TabContentFactory() {
                @Override
                public View createTabContent(String tag) {
                    TextView tv = new TextView(Main.this);
                    tv.setText("tab 1 content");
                    return tv;
                }
            });

            tabHost.addTab(tab);

            setContentView(tabHost);
        }
    }

我遇到了这个错误:

    [...]
    07-13 20:26:49.261: ERROR/AndroidRuntime(625): Caused by: java.lang.NullPointerException
    07-13 20:26:49.261: ERROR/AndroidRuntime(625):     at android.widget.TabHost.addTab(TabHost.java:206)
    07-13 20:26:49.261: ERROR/AndroidRuntime(625):     at test.test.Main.onCreate(Main.java:27)
    [...]

我需要通过代码实现这个功能,不能使用XML。请问有谁可以帮我修复一下这段代码吗?

4个回答

44

针对那些可能会关注TabActivity被弃用的人们,文档表明在没有使用TabActivity时需要在添加选项卡之前调用setup()方法。

tabHost.setup();

我总是忘记这一点,最终会看到你的评论。谢谢。 - Ruddles
3
缺乏文档真是太让人头疼了...如果找不到这个特定的方法,那就惨了。太感谢了! - Sven Menschner
1
@SvenMenschner 同意。这是一种与其他(Android)设计模式不同的设计模式。除了构造函数调用外,还需要调用一个无参数的设置方法。对我来说完全没有意义。 - Sebastian Hojas

8

您应该使用TabActivity,它需要设置与内容相同的特殊布局(请参见http://developer.android.com/resources/tutorials/views/hello-tabwidget.html)。如果您无法使用xml,则应从Java代码构建相同的内容:

public class Main extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TabHost tabHost = new TabHost(this);
    tabHost.setId(android.R.id.tabhost);

    TabWidget widget = new TabWidget(this);
    widget.setId(android.R.id.tabs);

    FrameLayout content = new FrameLayout(this);
    content.setId(android.R.id.tabcontent);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    layout.addView(widget);
    layout.addView(content);

    tabHost.addView(layout);

    setContentView(tabHost);

    TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1");
    tab1.setIndicator("Tab 1");
    tab1.setContent(new TabHost.TabContentFactory() {
        @Override
        public View createTabContent(String tag) {
            TextView tv = new TextView(Main.this);
            tv.setText("tab 1 content");
            return tv;
        }
    });

    tabHost.addTab(tab1);

    TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2");
    tab2.setIndicator("Tab 2");
    tab2.setContent(new TabHost.TabContentFactory() {
        @Override
        public View createTabContent(String tag) {
            TextView tv = new TextView(Main.this);
            tv.setText("tab 2 content");
            return tv;
        }
    });

    tabHost.addTab(tab2);

    setContentView(tabHost);
}

}


我需要在一个活动中添加一个选项卡作为组件。 - Joel
嗯...但是TabHost不能在TabActivity之外工作。关键是将tabhost添加到预定义的Activity(可能是MapActivity或其他),不是吗? - FeelGood
不,这是为一个库而设计的。算了,如果不能做到,我会使用其他东西,并稍后自己编写更好的选项卡。 - Joel
TabActivity已经被弃用,因此我认为TabHost不需要它。有没有人能够指导我如何使用TabHost而不依赖于废弃的类? - Jules

2
检查框架源代码中的TabHost.addTab(...)方法,建议您的TabWidget尚未就绪。TabWidget必须先在代码中创建或在创建布局时由系统创建,并且必须具有id为android.R.id.tabs

1

你有没有考虑扩展TabActivity,然后调用getTabHost()来获取TabHost的实例?不确定你的目标是什么,但这可能值得一看。


是的,我有,但TabActivity是一个Activity,而我需要一个View。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接