Android:没有 TabActivity 的 TabHost
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3163884/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: TabHost without TabActivity
提问by paradroid666
I want to create tabs withoutextending TabActivity. (The reason is that TabActivity cannot handle a custom titlebar as it seems). I have
我想在不扩展 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);
}
}
}
The error I get is
我得到的错误是
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.
The xml for the view is
视图的 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>
I read somewhere that I have to use a LocalActivityManager, I assume that I am missing something there. Anyone an idea?
我在某处读到我必须使用 LocalActivityManager,我认为我在那里遗漏了一些东西。任何人的想法?
Thanks!
谢谢!
回答by dcanh121
Before calling tabHost.setup(mLocalActivityManager); you need to add this line.
在调用 tabHost.setup(mLocalActivityManager) 之前;你需要添加这一行。
mlam.dispatchCreate(savedInstanceState);
tabHost.setup(mlam );
similarly, you need to add for onResume,
同样,您需要为 onResume 添加,
mlam.dispatchResume();
onPause(),
暂停(),
mlam.dispatchPause(isFinishing());
回答by CommonsWare
Please consider using Views
as the contents of your tabs. Not only will this result in less code, less consumed heap space, less consumed stack space, and lower CPU utilization, it will also get you past this problem. Here are twoexamplesshowing this technique.
请考虑Views
用作标签的内容。这不仅会导致更少的代码、更少的堆空间消耗、更少的堆栈空间消耗和更低的 CPU 利用率,它还可以让您解决这个问题。以下是展示此技术的两个示例。
回答by Lefteris E
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());
}
}
回答by stanlick
Design considerations notwithstanding, the following does not work at all, and the API seems to indicate that setContent(Intent i)
is valid. This works when the activity extends TabActivity
, however, extending Activity
and adding setup()
call results in an exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)
尽管有设计考虑,以下内容根本不起作用,并且 API 似乎表明这setContent(Intent i)
是有效的。这在活动扩展时有效TabActivity
,但是,扩展Activity
和添加setup()
调用会导致exception at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:649)
Funny thing is, the LogCat suggests I forgot to call setup()
有趣的是,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));