Android - Tabhost 在 Activity 类中工作 [英] Android - Tabhost working in Activity class

查看:23
本文介绍了Android - Tabhost 在 Activity 类中工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我一定是忽略了一些愚蠢的事情,因为我无法让我的 tabhost 显示在我的活动类中.当我尝试运行该应用程序时,我得到了可怕的力量.如果我扩展 TabActivity,它将起作用,但我不能这样做 [请参阅下面的编辑] 因为一旦我从我的原型项目中移动代码,它将位于从 Activity 继承的自定义类中.

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.

这是 XML 布局:

<?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>

这是尝试创建和显示 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

它抱怨没有调用 setup,但我正在调用它.还有另一个版本的安装程序需要某种 LocalActivityMananger.我曾尝试更换呼叫以设置下面的呼叫,但没有运气.

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] 上面的调用不起作用,所以我把它拿回来了.虽然我记录了一个新的错误.

[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.

根据下面的一些评论,我意识到我需要更清楚为什么我不能从 TabActivity 继承.一旦我的原型工作,我需要将它移植到从 Activity 继承的现有应用程序的屏幕中.我需要将 TabHost 加载到该活动中的布局中.它基本上是一个带有一行状态图标的 LinearLayout,然后是我的带有 Tabhost 的 LinearLayout.我知道,如果我能做到这一点,我就可以进入下一阶段.谢谢!

[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       |
---------------------------

推荐答案

好的,我想通了.显然,TabActivity 扩展了 ActivityGroup,它扩展了 Activity.但是在您的代码中,您的类扩展了 Activity,它不是活动组.

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.

所以有两种选择:

1) 如果您希望标签内容是活动,请让您的类扩展 ActivityGroup(而不是 Activity).那么你对 setup 的调用应该是 host.setup(getLocalActivityManager());

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

通过这种方式,您可以模拟 TabActivity 源代码.

This way you are emulating the TabActivity source code.

2) 如果你可以让你的标签内容是视图(vs 活动),保持你的类从 Activity 扩展,并保持对 setup() 的调用.但是对于 setContent 部分,请执行以下操作:

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

然后在 createTabContent 中定义您的列表视图(这通常是我所做的 - 我更喜欢使用视图而不是活动作为选项卡的内容).

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).

这篇关于Android - Tabhost 在 Activity 类中工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆