【问题标题】:android TabHost inside a LinearLayoutLinearLayout 中的 android TabHost
【发布时间】: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

标签: android android-tabhost


【解决方案1】:

问题解决了。 来自另一个 stackoverflow 问题的用户 207 在其中一个 cmet 中给出的正确解决方案是:

这是 XML:

<?xml version="1.0" encoding="utf-8"?>

<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="@android: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文件:

package eu.pkg.tabsExample;

import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TabHost;

public class TabsExampleActivity extends Activity {

    TabHost tabHost;
    LocalActivityManager mLocalActivityManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initTabs(savedInstanceState);
    }

    @Override
    protected void onResume() {
        mLocalActivityManager.dispatchResume(); 
        super.onResume();
    }

    @Override
    protected void onPause() {
        mLocalActivityManager.dispatchPause(isFinishing());
        super.onPause();
    }

    private void initTabs(Bundle savedInstanceState) {
        Resources res = getResources();                     // Resource object to get Drawables
        tabHost = (TabHost) findViewById(android.R.id.tabhost);     // The activity TabHost
        mLocalActivityManager = new LocalActivityManager(this, false);
        mLocalActivityManager.dispatchCreate(savedInstanceState);
        tabHost.setup(mLocalActivityManager);

        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);
    }
}

幕后的魔力在于这 4 行代码:

    tabHost = (TabHost) findViewById(android.R.id.tabhost);     // The activity TabHost
    mLocalActivityManager = new LocalActivityManager(this, false);
    mLocalActivityManager.dispatchCreate(savedInstanceState);
    tabHost.setup(mLocalActivityManager);

感谢大家对此答案的贡献。

【讨论】:

    【解决方案2】:

    如果您使用 Activity 而不是扩展 TabActivity,这是解决方案

    https://stackoverflow.com/a/5098774/563306

    【讨论】:

      【解决方案3】:

      更改此特定行

      TabHost android:id="@+id/tabhost"

      TabHost android:id="@android:id/tabhost"

      编辑

      在下面一行之后添加

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

      【讨论】:

      • 我现在改成这样了: 在java中是这样的:private void initTabs() { 资源 res = getResources(); // 获取Drawables的资源对象 tabHost = (TabHost) findViewById(android.R.id.tabhost); // 活动 TabHost tabHost.setup(); TabHost.TabSpec 规范; // 每个选项卡 Intent 意图的可重用 TabSpec; // 每个选项卡的可重用 Intent ///............其余代码
      • 你能添加完整的logcat吗?
      • 我编辑原始帖子以添加日志。在页面顶部查看。
      • 您可以尝试排除第一个标签吗?看看它是否有效?不包括此意图 = new Intent("eu.pkg.tabsExample.BuildingTabActivity"); spec = tabHost.newTabSpec("text").setIndicator("", res.getDrawable(R.drawable.tab_text_selector)) .setContent(intent); tabHost.addTab(spec);
      • 你看到了 :) 我学到了关于在选项卡中管理意图的新知识。之前不知道。
      【解决方案4】:

      This 将修复您的错误。

      另外:我刚刚读到您想从Activity 扩展而不是TabActivity,因为您正在尝试实现“嵌套标签”。在另一个TabActivity 中包含TabActivity 应该不是问题。以前没有这样做过,但我没有看到任何可能出现的问题。添加ActivityTabActivity 作为选项卡内容没有区别。你可以试试看

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多