【发布时间】:2012-09-06 18:39:36
【问题描述】:
在寻找解决方案后,我决定重新提问already asked here。
我有一个 TabHost 控件,我需要将它放在其他布局(LinearLayout)中。我把 google 给我们的例子(http://developer.android.com/resources/tutorials/views/hello-tabwidget.html)塞进去了,唯一的区别是 TabHost 不是布局的根,显示视图的 Activity 类没有扩展 TabActivity,而是 Activity
我的 xml 是这样的:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost android:id="@+id/tabhost"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="5dp">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent" android:layout_height="53px"
android:tabStripEnabled="false" android:layout_margin="1px"
android:background="#222222" />
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
</LinearLayout>
java 类是这样的:
public class TabsExampleActivity extends Activity {
TabHost tabHost;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initTabs();
}
private void initTabs() {
Resources res = getResources(); // Resource object to get Drawables
tabHost = (TabHost) findViewById(R.id.tabhost); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
intent = new Intent("eu.pkg.tabsExample.BuildingTabActivity");
spec = tabHost.newTabSpec("text").setIndicator("",
res.getDrawable(R.drawable.tab_text_selector))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, ClipArtTabActivity.class);
spec = tabHost.newTabSpec("clipart").setIndicator("",
res.getDrawable(R.drawable.tab_clipart_selector))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, FrameSelectorTabActivity.class);
spec = tabHost.newTabSpec("frame").setIndicator("",
res.getDrawable(R.drawable.tab_frame_selector))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, BgSelectorTabActivity.class);
spec = tabHost.newTabSpec("bg").setIndicator("",
res.getDrawable(R.drawable.tab_bg_selector))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, BuildingTabActivity.class);
spec = tabHost.newTabSpec("build").setIndicator("",
res.getDrawable(R.drawable.tab_build_selector))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(4);
}
}
如果我使用 TabActivity 作为基本活动,并且我使用 TabHost 作为 root,那么代码运行良好,我看到了选项卡......等等。
仅当我扩展 Activity 并且错误为:
04-11 18:53:38.874: 错误/AndroidRuntime(32539): java.lang.RuntimeException:无法启动活动 组件信息{eu.pkg.tabsExample/eu.pkg.tabsExample.TabsExampleActivity}: java.lang.NullPointerException
问题是:如何在 LinearLayout 中托管 TabHost?
编辑:
按照cmets的建议修改后,log cat错误为:
04-11 20:52:01.993: 错误/imdg81(28747): IsShutDownStarted() 04-11 20:52:01.999:错误/SensorManager(28747):registerListener 4:gp2a 光传感器延迟:240 04-11 20:52:01.999:错误/SensorManager(28747): =======>>>传感器线程正在运行
【问题讨论】:
-
不扩展 TabActivity 就无法创建 Tab。
-
你确定吗?你从哪里得到这些信息? TabHost 有什么替代方案可以存在于另一个布局中?
-
在线性布局中包含 tabhost 不是问题(我也在这样做),但如果不扩展 tabactivity,您将无法创建 Tab。
-
您对 TabActivity 有什么反对意见?它继承自 Activity,因此切换到它不会失去功能。
-
This 将修复您的错误。您可以在没有 TabActivity 的情况下创建选项卡,就像您可以在不扩展 ListActivity 的情况下使用 ListView。这些类只是让它更简单。但是,您可以考虑使用 ActionBar 选项卡(例如 ActionBarSherlock 以实现兼容性),因为不推荐使用 TabActivity