ITEEDU

用ActivityGroup实现tab分页和导航框架

加载Activity时只改变非导航部分,导航一直不变。

包括点击导航加载Activity,也包括点击Activity控件加载Activity。

加载的Activity可以改变导航的内容。

ActivityGroupActivity

关键方法:

    public void loadActivity(String id,Class c){
    	container.removeAllViews();
        container.addView(getLocalActivityManager().startActivity(
                id,new Intent(this, c)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                .getDecorView());
    }

加载Activity到当前Activity的container控件中。

public class ActivityGroupActivity extends ActivityGroup {

    private ScrollView container = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 设置视图
        setContentView(R.layout.main);

        container = (ScrollView) findViewById(R.id.containerBody);
        // 模块2
        ImageView btnModule2 = (ImageView) findViewById(R.id.btnModule2);
        btnModule2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
            	loadActivity("Module2", ModuleView2.class);
                
            }
        });

        // 模块3
        ImageView btnModule3 = (ImageView) findViewById(R.id.btnModule3);
        btnModule3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
            	loadActivity("Module3", ModuleView3.class);
            }
        });
    }
    public void loadActivity(String id,Class c){
    	container.removeAllViews();
        container.addView(getLocalActivityManager().startActivity(
                id,new Intent(this, c)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                .getDecorView());
    }
}

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:gravity="center_horizontal"
         android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView android:id="@+id/cust_title" android:textColor="@android:color/white"
            android:textSize="28sp" android:text="模块1" android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>
    </LinearLayout>
    <!-- 中间动态加载View -->
    <ScrollView android:measureAllChildren="true" android:id="@+id/containerBody"
        android:layout_weight="1" android:layout_height="fill_parent"
        android:layout_width="fill_parent">
    </ScrollView>
    <LinearLayout android:background="@android:color/black"
        android:layout_gravity="bottom" android:orientation="horizontal"
        android:layout_width="fill_parent" android:layout_height="wrap_content">
        <!-- 功能模块按钮1 -->
        <!-- 功能模块按钮2 -->
        <ImageView android:id="@+id/btnModule2" android:src="@android:drawable/ic_dialog_info"
            android:layout_marginLeft="7dp" android:layout_marginTop="3dp"
            android:layout_marginBottom="3dp" android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <!-- 功能模块按钮3 -->
        <ImageView android:id="@+id/btnModule3" android:src="@android:drawable/ic_dialog_alert"
            android:layout_marginLeft="7dp" android:layout_marginTop="3dp"
            android:layout_marginBottom="3dp" android:layout_width="wrap_content"
            android:layout_height="wrap_content" />


        <TextView
            android:id="@+id/menutext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

    </LinearLayout>
</LinearLayout>

ModuleView3  

有两个事件,一个改变导航,一个加载Activity。

关键在于this.getParent()会等到框架Activity的引用。更好的方法是自定义一个Application,在其中有一个框架Activity的引用。这样在每个Activity中都可以通过this.getApplication()来找到框架Activity的引用。由框架Activity加载Activity的方法也可以放在Application直接调用。

public class ModuleView3  extends Activity{
	TextView t;
	 protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        // 隐藏标题栏
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        // 设置视图
	        setContentView(R.layout.l3);
	        Button b=(Button) this.findViewById(R.id.button1);
	        final ActivityGroupActivity aga=
	(ActivityGroupActivity)this.getParent();
	        t=(TextView)aga.findViewById(R.id.menutext);
	        b.setOnClickListener(new OnClickListener(){

				@Override
				public void onClick(View arg0) {
					// TODO Auto-generated method stub
					t.setText("Click By Button1");
				}
	        	
	        });
	        b=(Button) this.findViewById(R.id.button2);
	        b.setOnClickListener(new OnClickListener(){

				@Override
				public void onClick(View arg0) {
					// TODO Auto-generated method stub
					aga.loadActivity("Module1", ModuleView4.class);
				}
	        	
	        });
	 }
}

L3.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"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="改变导航" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="打开另一个Activity" />

</LinearLayout>

ModuleView2  和ModuleView4

代码一样。布局文件一个有两个TextView一个只有一个CheckBox。

public class ModuleView2  extends Activity{
	 protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        // 隐藏标题栏
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        // 设置视图
	        setContentView(R.layout.l2);
	 }
}

第一个Activity

第二个Activity

改变导航条

从第三个Activity加载第四个Activity