【问题标题】:Android: TabHost without TabActivityAndroid:没有 TabActivity 的 TabHost
【发布时间】:2010-07-02 07:15:24
【问题描述】:

我想创建标签而不扩展 TabActivity。 (原因是 TabActivity 无法处理看起来的自定义标题栏)。我有

public class startTab extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);
        Resources res = getResources();
        LocalActivityManager mlam = new LocalActivityManager(this, false);
        TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
        tabHost.setup(mlam);
        TabHost.TabSpec spec;
        Intent intent;

    intent = new Intent().setClass(this, Show1.class);
    spec = tabHost.newTabSpec("Items").setIndicator("Items", res.getDrawable(R.drawable.items32_ldpi)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, Show2.class);
    spec = tabHost.newTabSpec("Users").setIndicator("Users",res.getDrawable(R.drawable.user32_ldpi)).setContent(intent);
    tabHost.addTab(spec);
}

}

我得到的错误是

    07-02 07:11:12.715: ERROR/AndroidRuntime(411): 
Caused by: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.

视图的xml是

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/tabhost" android:orientation="vertical" 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:paddingTop="5dip">
  <TabWidget android:id="@android:id/tabs"
   android:layout_width="fill_parent" android:layout_height="fill_parent"></TabWidget>
  <FrameLayout android:id="@android:id/tabcontent"
   android:layout_width="fill_parent" android:layout_height="fill_parent"
   android:paddingTop="5dip">
  </FrameLayout>
 </LinearLayout>
</TabHost>

我在某处读到我必须使用 LocalActivityManager,我认为我在那里遗漏了一些东西。有人有想法吗?

谢谢!

【问题讨论】:

标签: android android-tabhost


【解决方案1】:

在调用 tabHost.setup(mLocalActivityManager); 之前你需要添加这一行。

mlam.dispatchCreate(savedInstanceState);
tabHost.setup(mlam );

同样,你需要为 onResume 添加,

mlam.dispatchResume(); 

onPause(),

 mlam.dispatchPause(isFinishing());

【讨论】:

  • 但是你能解释一下为什么在添加这些 dispatchXXX() 方法后它会起作用吗?非常感谢:)
  • 太棒了!但是知道为什么所有这些额外的行吗?
  • 它对我不起作用.. 我收到了android.util.AndroidRuntimeException: You cannot combine custom titles with other title features。请注意,我的代码与问题所示非常相似,并且我正在使用 自定义标题功能
  • 这是一个丑陋的解决方案。另一种选择是扩展 ActivityGroup,但想法不是让 Activity 扩展奇怪的东西只是因为它必须显示选项卡。那么也许 CommonsWare 关于使用视图的答案是最好的?但是不能只使用已经存在的活动有点烦人...
  • 它也不起作用(或者至少解决方案不完整)。我所有的标签现在都是空的。
【解决方案2】:

请考虑使用Views 作为标签的内容。这不仅会导致更少的代码、更少的堆空间消耗、更少的堆栈空间消耗和更低的 CPU 利用率,它还会让你克服这个问题。这里是 two examples 展示了这种技术。

【讨论】:

  • 谢谢。但是,如果我不使用意图,如何为每个选项卡设置不同的菜单?
  • @paradroid:根据当前活动标签加载不同的菜单。
  • 这就是使用 Activity 的重点——它是更好的功能分离。
  • @kilaka:不是这样。选项卡中的活动已被弃用,因为 Google 同意这是一个坏主意。
【解决方案3】:
public class ScoreboardActivity extends Activity {
    LocalActivityManager mlam;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scoreboard);
        mlam = new LocalActivityManager(this, false);
        mlam.dispatchCreate(savedInstanceState);
        TabHost th = (TabHost) findViewById(android.R.id.tabhost);
        th.setup(mlam);
        th.addTab(th.newTabSpec("Numpad").setIndicator("Numpad").setContent(R.id.tab1));
        th.addTab(th.newTabSpec("CardCount").setIndicator("CardCount").setContent(R.id.tab2));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_scoreboard, menu);
        return true;


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

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

}

【讨论】:

  • LocalActivityManager 现已弃用
【解决方案4】:

尽管有设计考虑,但以下内容根本不起作用,API 似乎表明setContent(Intent i) 是有效的。这在活动扩展 TabActivity 时有效,但是,扩展 Activity 并添加 setup() 调用会导致 exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)

有趣的是,LogCat 提示我忘记拨打 setup()

mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();

Intent tab1Intent = new Intent(this, ActivityOne.class);
Button tab1View = new Button(this);
tab1View.setText("Activity 1");
  mTabHost.addTab(mTabHost.newTabSpec("tab_1").setIndicator(tab1View).setContent(tab1Intent));

【讨论】:

  • 这看起来应该是一个单独的问题。您可能遇到的问题是您没有使用 TabbedActivity,这意味着您需要使用 ActivityManager 调用设置,如上所述。这将导致您遇到此问题,除非您将事件正确分派到 ActivityManager。
猜你喜欢
  • 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
相关资源
最近更新 更多