现在的位置: 首页 > 综合 > 正文

ActivityGroup 管理一组activity

2013年01月31日 ⁄ 综合 ⁄ 共 5354字 ⁄ 字号 评论关闭

本文只要讲解:

(1)ActivityGroup中的activity切换动画

ActivityGroup中有一堆activity,我们可以很轻松的设置前进动画,和返回动画。

(2)ActivityGroup向任意一个子activity传送消息

比如,我们在一个子activity使用了startActivityForResult,那么返回时,调用的是activityGroup对象的onActivityResult方法,而不是这个子activity的onActivityResult方法,

所以我们就必须让activityGroup在onActivityResult中将消息传给那个子activity。


(1)切换动画

采用viewAnimator

1、设置进入和出来动画:

viewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_from_right));
viewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_to_left));

2、显示前一个页面和后一个页面:

	viewAnimator.showNext();
	viewAnimator.showPrevious();


3、页面前进方法:

class1 : 前进要打开的activity类

bundle : 参数传递

activityString : 要打开的activity的字符标记,方便activityGroup定位

public void gotoActivity(Bundle bundle, Class<?> class1, String activityString) {
        Intent intent = new Intent(this, class1).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtras(bundle);
        Window w = getLocalActivityManager().startActivity(activityString, intent);

        currentActivityString.add(activityString);
        viewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_from_right));
        viewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_to_left));
        View view = w.getDecorView();
        history.add(view);
        viewAnimator.addView(view);
        viewAnimator.showNext();
        group.setContentView(viewAnimator);
    }


4、页面返回方法:

动画设置类似

public void onBackPressedAction() {
        if (history.size() > 1) {
            viewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_from_left));
            viewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_to_right));
            viewAnimator.showPrevious();
            viewAnimator.removeView(history.get(history.size() - 1));currentActivityString.remove(currentActivityString.size() - 1);
            history.remove(history.size() - 1);
            history.get(history.size() - 1).clearFocus();
            group.setContentView(viewAnimator);
        } else {
            showDialog(DIALOG_APP_EXIT);
        }
    }


group : activitygroup对象

history : 作为一个页面浏览历史记录,以一个堆栈的形式维护。堆顶便是当前activity的view。
(2)传送消息

如果我们用

group.getLocalActivityManager().getCurrentActivity()

获取到的不是我们当前显示的页面,是group中最后打开的那个activity。

如果 :

我们从A -> B -> C -> D 

在返回 -> C的时候


得到的是D,而不是C。怎么才能获取当前显示的activity呢,

我设置了一个堆栈变量

    /*
     * the getCurrentActivity method returns the last Activity
     * 
     * this field is used for get currently displayed activity
     */
    public List<String> currentActivityString = new ArrayList<String>();

在页面前进和后退中修改他的值,获取当前activity的方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            switch (resultCode) {
            case RESULT_OK:
                String string = currentActivityString.get(currentActivityString.size() - 1);
                if (string == "Jingxuan")
                    ((Jingxuan) getLocalActivityManager().getActivity("Jingxuan")).onActivityResult(requestCode,
                                    resultCode, data);
                break;
            }
        }
    }

这样就在activityGroup对象的onActivityResult方法中将消息传给那个子activity。


MyActivityGroup.java 整个代码如下:

import java.util.ArrayList;
import java.util.List;

import android.app.ActivityGroup;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.ViewAnimator;

public class MyActivityGroup extends ActivityGroup {
    public MyActivityGroup group = null;
    /*
     * the getCurrentActivity method returns the last Activity
     * 
     * this field is used for get currently displayed activity
     */
    public List<String> currentActivityString = new ArrayList<String>();
    public ArrayList<View> history = null;
    /**
     * 页面切换的动画
     */
    public ViewAnimator viewAnimator = null;

    public final int DIALOG_APP_EXIT = 0;

    public void onCreate(Bundle savedInstanceState) {
        history = new ArrayList<View>();
        viewAnimator = new ViewAnimator(this);
        group = this;
        super.onCreate(savedInstanceState);
    }

    public void gotoActivity(Bundle bundle, Class<?> class1, String activityString) {
        Intent intent = new Intent(this, class1).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtras(bundle);
        Window w = getLocalActivityManager().startActivity(activityString, intent);

        currentActivityString.add(activityString);
        viewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_from_right));
        viewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_to_left));
        View view = w.getDecorView();
        history.add(view);
        viewAnimator.addView(view);
        viewAnimator.showNext();
        group.setContentView(viewAnimator);
    }

    /**
     * 将事件传给子activity
     */
    @Override
    public void onBackPressed() {
        getLocalActivityManager().getActivity(currentActivityString.get(currentActivityString.size() - 1))
                        .onBackPressed();
    }

    public void onBackPressedAction() {
        if (history.size() > 1) {
            viewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.in_from_left));
            viewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.out_to_right));
            viewAnimator.showPrevious();
            viewAnimator.removeView(history.get(history.size() - 1));
            currentActivityString.remove(currentActivityString.size() - 1);
            history.remove(history.size() - 1);
            history.get(history.size() - 1).clearFocus();
            group.setContentView(viewAnimator);
        } else {
            showDialog(DIALOG_APP_EXIT);
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog = null;
        switch (id) {
        case DIALOG_APP_EXIT:
            dialog = new AlertDialog.Builder(this).setMessage("确定退出?").setTitle("提示")
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                    android.os.Process.killProcess(android.os.Process.myPid());
                                    finish();
                                }
                            }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            }).create();
        }
        return dialog;
    }
}

   

抱歉!评论已关闭.