用ActivityGroup可以实现多个Activity的切换,ActivityGroup的出现打破了android单窗口管理的理念,但是google在3.0版本后就用新的类来代替它了,这个类叫fragment ,但是现在还是有很多应用都在用ActivityGroup,还是值得了解的。
本例将介绍ActivityGroup+ScrollView来实现TabActivity的页面效果
先来看看主Activity的配置文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_height="fill_parent">
<LinearLayout
android:background="@android:color/black"
android:layout_gravity="bottom"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/but1"
android:layout_width="150dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:text="第一页"
/>
<Button
android:id="@+id/but2"
android:layout_width="150dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:text="第二页"
/>
<Button
android:id="@+id/but3"
android:layout_width="150dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:text="第三页"
/>
</LinearLayout>
<ScrollView
android:measureAllChildren="true"
android:id="@+id/container"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
</ScrollView>
</LinearLayout>
新建一个Activity继承ActivityGroup
ActivityGroupTestActivity.java
package dxd.activitygroup.test;
import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;
public class ActivityGroupTestActivity extends ActivityGroup {
ScrollView container ;
Button but1 ;
Button but2 ;
Button but3 ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
container = (ScrollView)findViewById(R.id.container);
container.removeAllViews();
container.addView(getLocalActivityManager().startActivity(
"ActivityA", new Intent(ActivityGroupTestActivity.this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView());
setListener();
}
public void setListener(){
but1 = (Button)findViewById(R.id.but1);
but2 = (Button)findViewById(R.id.but2);
but3 = (Button)findViewById(R.id.but3);
but1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
container.removeAllViews();
container.addView(getLocalActivityManager().startActivity(
"ActivityA", new Intent(ActivityGroupTestActivity.this, ActivityA.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView());
}
});
but2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
container.removeAllViews();
container.addView(getLocalActivityManager().startActivity(
"ActivityB", new Intent(ActivityGroupTestActivity.this, ActivityB.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView());
}
});
but3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
container.removeAllViews();
container.addView(getLocalActivityManager().startActivity(
"ActivityC", new Intent(ActivityGroupTestActivity.this, ActivityC.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView());
}
});
}
}
到这里主要的代码就完了,其他的Activity文件和对应的布局文件,那就看自己的需求了。别忘在manifest文件中声明者三个Activity哦。
下面来介绍一下,从文档中可以看到ActivityGroup的类继承结构如下:
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
↳ android.app.ActivityGroup
而从文档中可以看出,其共用方法只有两个
getCurrrentActivity():返回一个Activity对象
getLocalActivityManager():返回LocalActivityManger对象,这个类是专门为ActivityGroup设定的,大概就是绕过android的单窗口机制,去直接调用启动Activity的系统线程,这个LocalActivityManager在实现原理上也是值得研究的。
其实在ActivityGroup中主要就是通过getLocalActivitymanager()来获得LocalActivityManager对象,通过这个对象来startActivity !!! 由文档可以查出这个方法:Window startActivity(String id, Intent intent)
所以getDecorView()是返回的Window对象调用的。