Android的 - Tabhost在Activity类工作工作、Android、Tabhost、Activity

2023-09-12 22:52:13 作者:撸啊撸、撸到外婆桥

OK,我必须忽视的东西愚蠢的,因为我不能让我的tabhost在我的活动类来显示。我得到了可怕的力量接近,当我尝试运行应用程序。这将工作,如果我延长TabActivity,,但我不能这样做, [参见下面编辑],因为一旦我将code从我的工程样机它要在继承的自定义类从活动。

下面是XML布局:

 < XML版本=1.0编码=UTF-8&GT?;
< TabHost的xmlns:机器人=htt​​p://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
 
Android控件之TabHost 转载篇

这是错误我得到在日志中。

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