web-dev-qa-db-ja.com

Android:TabActivityのないTabHost

タブを作成したいwithout 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を使用する必要があることをどこかで読みましたが、何かが欠けていると思います。誰でもアイデア?

ありがとう!

42
paradroid666

TabHost.setup(mLocalActivityManager)を呼び出す前に;この行を追加する必要があります。

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

同様に、onResumeに追加する必要があります。

mlam.dispatchResume(); 

onPause()、

 mlam.dispatchPause(isFinishing());
86
dcanh121

タブのコンテンツとしてViewsの使用を検討してください。これにより、コード、ヒープ領域、スタック領域、およびCPU使用率が低下するだけでなく、この問題も回避できます。 two このテクニックを示しています。

13
CommonsWare
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());
    }

}
4
Lefteris E

設計上の考慮事項にもかかわらず、以下はまったく機能せず、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));
1
stanlick