Android: TabHost без TabActivity
Я хочу создать вкладки без, расширяя 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, я предполагаю, что там что-то отсутствует. Любая идея?
Спасибо!
Ответы
Ответ 1
Перед вызовом tabHost.setup(mLocalActivityManager); вам нужно добавить эту строку.
mlam.dispatchCreate(savedInstanceState);
tabHost.setup(mlam );
Аналогично, вам нужно добавить для onResume,
mlam.dispatchResume();
OnPause(),
mlam.dispatchPause(isFinishing());
Ответ 2
Пожалуйста, используйте Views
как содержимое ваших вкладок. Мало того, что это приведет к меньшему количеству кода, меньшему количеству потребляемого пространства кучи, меньшему потреблению пространства стека и более низкому использованию ЦП, он также поможет вам преодолеть эту проблему. Вот два примеры, демонстрирующие эту технику.
Ответ 3
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
Несмотря на конструктивные соображения, следующее не работает вообще, и 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));