OK,我必须忽视的东西愚蠢的,因为我不能让我的tabhost在我的活动类来显示。我得到了可怕的力量接近,当我尝试运行应用程序。这将工作,如果我延长TabActivity,,但我不能这样做, [参见下面编辑],因为一旦我将code从我的工程样机它要在继承的自定义类从活动。
下面是XML布局:
< XML版本=1.0编码=UTF-8&GT?;
< TabHost的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID / tabhost
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<的LinearLayout
机器人:方向=垂直
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
< TabWidget
机器人:ID =@机器人:ID /标签
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT/>
<的FrameLayout
机器人:ID =@机器人:ID / tabcontent
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT/>
< / LinearLayout中>
< / TabHost>
这里是试图创建和显示TabHost类:
进口android.app.Activity;
进口android.content.Intent;
进口android.os.Bundle;
进口android.util.Log;
进口android.widget.TabHost;
公共类my_proto扩展活动
{
/ **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(包savedInstanceState)
{
Log.i(this.toString(),在OnCreate);
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
Log.i(this.toString()获得标签主机);
TabHost主机=(TabHost)findViewById(R.id.tabhost);
host.setup();
Log.i(this.toString(),加标签);
host.addTab(host.newTabSpec(1)
.setIndicator(第一结果)
.setContent(新意图(这一点,FirstResultsListViewActivity.class)));
host.addTab(host.newTabSpec(二)
.setIndicator(第二名的成绩)
.setContent(新意图(这一点,SecondResultsListViewActivity.class)));
Log.i(this.toString(),调整选项卡大小);
host.getTabWidget()getChildAt(0).getLayoutParams()高度= 35;
host.getTabWidget()getChildAt(1).getLayoutParams()高度= 35;
} //结束的onCreate
} //结束类my_proto
这是错误我得到在日志中。
11-17 16:49:51.271:INFO/com.my_proto.my_proto@43b80b50(1302):在OnCreate
11-17 16:49:51.472:INFO/com.my_proto.my_proto@43b80b50(1302):获得标签主机
11-17 16:49:51.480:INFO/com.my_proto.my_proto@43b80b50(1302):添加标签
11-17 16:49:51.521:DEBUG / AndroidRuntime(1302):关闭虚拟机
11-17 16:49:51.521:WARN / dalvikvm(1302):主题ID = 3:线程退出与未捕获的异常(组= 0x4001b188)
11-17 16:49:51.530:ERROR / AndroidRuntime(1302):未捕获的处理程序:螺纹主力退出,由于未捕获的异常
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.my_proto / com.my_proto.my_proto}:java.lang.IllegalStateException:你忘了打电话公共无效设置(LocalActivityManager的ActivityGroup)?
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread.access $ 2200(ActivityThread.java:119)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.os.Handler.dispatchMessage(Handler.java:99)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.os.Looper.loop(Looper.java:123)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread.main(ActivityThread.java:4363)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在java.lang.reflect.Method.invokeNative(本机方法)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在java.lang.reflect.Method.invoke(Method.java:521)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在dalvik.system.NativeStart.main(本机方法)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):java.lang.IllegalStateException:产生的原因你忘了叫'公共无效设置(LocalActivityManager的ActivityGroup)?
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.widget.TabHost $ IntentContentStrategy.getContentView(TabHost.java:646)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.widget.TabHost.setCurrentTab(TabHost.java:320)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.widget.TabHost.addTab(TabHost.java:213)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在com.mc_proto.mc_proto.onCreate(my_proto.java:29)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
11-17 16:49:51.552:ERROR / AndroidRuntime(1302):11 ...更多
它的抱怨没有要求设置,但我打电话吧。还有另一种版本的安装程序,需要某种LocalActivityMananger的。我曾尝试更换呼叫设置下面的电话,但没有运气。
LocalActivityManager mLocalActivityManager =新LocalActivityManager(这一点,假);
host.setup(mLocalActivityManager);
拨打以上没有工作,所以我把它背出来。虽然我得到一个新的错误记录。
11-17 20:24:58.382:ERROR / AndroidRuntime(1432):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.my_proto / com.my_proto.my_proto} :java.lang.IllegalStateException:活动不能被添加到含组已创建。
根据一些评论下面,我意识到我需要更清楚我为什么不能从TabActivity继承。有一次,我有原型的工作,我需要这个端口到现有的应用程序的屏幕继承了活动。我将需要加载TabHost到该活动中的布局。这将主要是有一排状态图标的LinearLayout,跟着我的Tabhost在它的LinearLayout。我知道,如果我能得到这个工作,我可以进入下一个阶段。谢谢!
---------------------------
|状态图标|
---------------------------
|标签,标签,标签|
| |
| |
| |
---------------------------
|状态图标|
---------------------------
解决方案
好吧,我想通了。显然, TabActivity
扩展的ActivityGroup
,它扩展了活动
。但是,在你的code类扩展了活动
这不是一个活动组。
那么有两种选择:
1)如果你想在标签内容要活动,有你的类扩展(的的ActivityGroup
,而不是活动
)。那么您的通话设置应 host.setup(getLocalActivityManager());
此方式,您都仿效 TabActivity
源$ C $ C。
2)如果你可以有你的选项卡的内容是访问量(与活动),让你的类从活动
延伸,并保持您的来电设置()
。但对于setContent部分做这样的事情:
host.addTab(host.newTabSpec(二)
.setIndicator(第二名的成绩)
.setContent(新TabContentFactory(){
公共查看createTabContent(字符串变量){
返回新的TextView(TestActivity.this);
}
}));
,然后定义里面createTabContent您的列表视图(这通常我做什么 - 我使用的观点,而不是活动的选项卡的内容preFER)。
OK, I must be overlooking something silly because I am unable to get my tabhost to display in my Activity class. I am getting the dreaded force close when I try to run the app. It will work if i extend TabActivity, but I can't do that [see edit below] because once I move the code from my prototype project its going to be in a custom class that inherits from Activity.
Here is the XML layout:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
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">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>
And here is the class that is trying to create and display the TabHost:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TabHost;
public class my_proto extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
Log.i(this.toString(), "OnCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(this.toString(), "get tab host");
TabHost host = (TabHost)findViewById(R.id.tabhost);
host.setup();
Log.i(this.toString(), "add tabs");
host.addTab(host.newTabSpec("one")
.setIndicator("First Results")
.setContent(new Intent(this, FirstResultsListViewActivity.class)));
host.addTab(host.newTabSpec("two")
.setIndicator("Second Results")
.setContent(new Intent(this, SecondResultsListViewActivity.class)));
Log.i(this.toString(), "adjust tab size");
host.getTabWidget().getChildAt(0).getLayoutParams().height = 35;
host.getTabWidget().getChildAt(1).getLayoutParams().height = 35;
}// end onCreate
}// end class my_proto
This is the error I get in the log.
11-17 16:49:51.271: INFO/com.my_proto.my_proto@43b80b50(1302): OnCreate
11-17 16:49:51.472: INFO/com.my_proto.my_proto@43b80b50(1302): get tab host
11-17 16:49:51.480: INFO/com.my_proto.my_proto@43b80b50(1302): add tabs
11-17 16:49:51.521: DEBUG/AndroidRuntime(1302): Shutting down VM
11-17 16:49:51.521: WARN/dalvikvm(1302): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
11-17 16:49:51.530: ERROR/AndroidRuntime(1302): Uncaught handler: thread main exiting due to uncaught exception
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.os.Handler.dispatchMessage(Handler.java:99)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.os.Looper.loop(Looper.java:123)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread.main(ActivityThread.java:4363)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at java.lang.reflect.Method.invokeNative(Native Method)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at java.lang.reflect.Method.invoke(Method.java:521)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at dalvik.system.NativeStart.main(Native Method)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): Caused by: java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:646)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.widget.TabHost.setCurrentTab(TabHost.java:320)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.widget.TabHost.addTab(TabHost.java:213)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at com.mc_proto.mc_proto.onCreate(my_proto.java:29)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
11-17 16:49:51.552: ERROR/AndroidRuntime(1302): ... 11 more
Its complaining about not calling setup, but I am calling it. There is another version of setup that needs some kind of LocalActivityMananger. I have tried replacing the call to setup the call below but no luck.
LocalActivityManager mLocalActivityManager = new LocalActivityManager(this, false);
host.setup(mLocalActivityManager);
[edit] The call above didn't work so I took it back out. Although I was getting a new error logged.
11-17 20:24:58.382: ERROR/AndroidRuntime(1432): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my_proto/com.my_proto.my_proto}: java.lang.IllegalStateException: Activities can't be added until the containing group has been created.
[edit] Based on some of the comments below I realized I need to be clearer about why I can't inherit from TabActivity. Once I have the prototype working I need to port this into an existing app's screen that inherits from Activity. I will need to load the TabHost into a Layout within that Activity. It will basically be a LinearLayout with a row of status icons, followed my a LinearLayout with the Tabhost in it. I know that if I can get this working I can move onto the next phase. Thanks!
---------------------------
| status icons |
---------------------------
| Tab, Tab, Tab |
| |
| |
| |
---------------------------
| status icons |
---------------------------
解决方案
Ok I figured it out. Apparently, TabActivity
extends ActivityGroup
, which extends Activity
. But in your code your class extends Activity
which is not an activity group.
So there are two options:
1) If you want the tab content to be activities, have your class extend ActivityGroup
(instead of Activity
). Then your call to setup should be host.setup(getLocalActivityManager());
This way you are emulating the TabActivity
source code.
2) If you can have your tab content be views (vs activities), keep your class as extending from Activity
, and keep your call to setup()
. But for the setContent part do something like this:
host.addTab(host.newTabSpec("two")
.setIndicator("Second Results")
.setContent(new TabContentFactory() {
public View createTabContent(String tag) {
return new TextView(TestActivity.this);
}
}));
And then define your list view inside createTabContent (that's usually what I do - I prefer using views instead of activities as the contents of the tabs).