42

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

ありがとう!

4

4 に答える 4

86

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

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

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

mlam.dispatchResume(); 

onPause()、

 mlam.dispatchPause(isFinishing());
于 2011-02-23T23:45:25.057 に答える
13

Viewsタブの目次としてご利用をご検討ください。これにより、コード、消費されるヒープ スペース、消費されるスタック スペース、および CPU 使用率が減少するだけでなく、この問題を回避することもできます。このテクニックを示す2 つの 例を次に示します。

于 2010-07-02T07:42:46.607 に答える
4
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());
    }

}
于 2013-01-01T15:47:38.167 に答える
1

設計上の考慮事項にもかかわらず、以下はまったく機能せず、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));
于 2010-08-19T15:55:46.453 に答える