今回は 1画面 複数Activity です。
# 複数の Activity は同じプロセスになります。
ActivityGroup を継承します。
TabActivity はこの ActivityGroup を継承していて、そのため各タブに Acitivity を割り当てることが可能なんです。
構造としてはこんな感じ
親Activity (ActivityGroup)
|
|+---- 子Activity1 (Activity)
|
|+---- 子Activity2 (Activity)
|
...
親 Activity は getLocalActivityManager() で取得した LocalActivityManager のstartActivity(String id, Intent intent) で子Activityを起動します。
startActivity(String id, Intent intent) は戻り値として Window を返すので、この Window の getDecorView() で取得した View を対応するコンテナ (LinearLayout とか FrameLayout) とかに addView() すればOK。
startActivity の第1引数の String は Activity の識別子(id)で、LocalActivityManager.getCurrentId() を使って現在の Activity の id を取得することが可能。
LocalActivityManager.getActivity(String id) で特定の id のActivity を取得することができるし、LocalActivityManagergetCurrentActivity() で現在の Activity を取得することもできる。
■ ボタンをクリックしたら 同じ画面で Activity を切り替えるサンプル
# まずは最小構成で。
親 Activity のレイアウト (parent.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/parent"
android:orientation="horizontal"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="showChild1"
android:text="show child1 Activity"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="showChild2"
android:text="show child2 Activity"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/child"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center">
</LinearLayout>
</LinearLayout>
id/child に子 Activity の View を入れることになります。
子1 Activity のレイアウト (child1.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is child1 Activity"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"/>
</LinearLayout>
子2 Activity のレイアウト (child2.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is child2 Activity"/>
</LinearLayout>
親 Activity
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.LinearLayout;
public class MyActivityGroup extends ActivityGroup {
LinearLayout container;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.parent);
container = (LinearLayout) findViewById(R.id.child);
}
public void showChild1(View v) {
container.removeAllViews();
Intent intent = new Intent(MyActivityGroup.this, Child1Activity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Window childActivity = getLocalActivityManager().startActivity("child1Activity",intent);
container.addView(childActivity.getDecorView());
}
public void showChild2(View v) {
container.removeAllViews();
Intent intent = new Intent(MyActivityGroup.this, Child2Activity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Window childActivity = getLocalActivityManager().startActivity("child2Activity",intent);
container.addView(childActivity.getDecorView());
}
}
さて、ここからが応用です。
■ Tab の中で画面遷移
TabContent に入れる Activity を AcitivityGroup にすればタブの中で画面遷移ができます。
上記 MyActivityGroup をそのまま TabActivity の Content に入れてみます。
構造はこんな感じ
TabActivity (Activity)
|
|+--- Tab1 (ActivityGroup)
| |
| |+---- 子Activity1 (Activity)
| |
| |+---- 子Activity2 (Activity)
|
|+--- Tab2 (Activity)
|
|+--- Tab3 (Activity)
AndroidManifest.xml に Activity を宣言するの忘れずに!
package yanzm.example.activitygroup2;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;
public class MyActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab_layout);
Resources res = getResources();
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, MyActivityGroup.class);
spec = tabHost.newTabSpec("tab1")
.setIndicator("Home", res.getDrawable(R.drawable.ic_tab_home))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, Tab2Activity.class);
spec = tabHost
.newTabSpec("tab2")
.setIndicator("Camera",
res.getDrawable(R.drawable.ic_tab_camera))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, Tab3Activity.class);
spec = tabHost.newTabSpec("tab3")
.setIndicator("Star", res.getDrawable(R.drawable.ic_tab_star))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(2);
}
}
LocalManager の startActivity() メソッドのリファレンスでも触れられているように、Activity のライフサイクルをちゃんと管理しないとダメでしょうね。
ここでは、
* Intent が現在は知っているのとは異なる Activity コンポーネントにマップされる場合、現在の Activity は finish して、新しいのがスタートする。
* 現在の Activity が non-multiple launch mode (singleTop のような) を使っている場合、もしくは Intent に FLAG_ACTIVITY_SINGLE_TOP flag がセットされている場合、現在の Activity は走ったまま残り、Activity.onNewIntent() メソッドが呼ばれる。
* 新しい Intent が extras を除いて以前のと同じで、新しい Intent に FLAG_ACTIVITY_CLEAR_TOP が設定されていない場合、現在の Activity はそのままの状態で走り続ける。
* それ以外の場合、現在の Activity は finish して新しいのがスタートする
などが書かれています。
タブの中で画面遷移するサンプル zip はこちら ActivityGroupSample2.zip
このコメントは投稿者によって削除されました。
返信削除