ActivityGroup的应用以及跳转问题

这个问题应该涉及到所有实现了Tab风格的应用的设计
android的SDK提供了TabHost,TabWidget控件和TabActivity来支持这种方式,但是我感觉限制比较大,就尝试使用ActivityGroup去做。
在布局中,总要设置一个导航的菜单栏,iphone的是放在下面的。



总体上的布局都是如此的,整体的布局一般是一个RelativeLayout,下面放一个width是fill_parent的菜单栏。
contain是一个容器,我自己用过很多,比如LinearLayout,ViewAnimator等等,后者支持动画,不过其实这样的布局,上面的内容有点动画,看起来会有点怪。
ActivityGroup里面有个非常重要的成员,它是负责subActivity管理的——LocalActivityManager,可以通过getLocalActivityManager()来获的。
来看一下这个成员有什么作用,当然从老农的博客里面可以去寻找这个类的中文API啦~
public Activity getCurrentActivity()
返回当前的activity,也就是状态是running的subActivity,也就是getAcitivity(getCurrentId())的实现
public String getCurrentId()
见上条
public void removeAllActivities()
销毁所有的subActivity
public Activity getActivity(String id)
通过acitivityId找到这个group对应的Activity对象。
public Window destroyActivity(String id, boolean finish)
这个是负责结束某一个subActivity的,在每次我们开启一个新的activity的时候,往往给他一个activityId,然后我们就可以通过这个id去销毁他。
public Window startActivity(String id, Intent intent)
在当前的group里面运行一个新的subActivity,必须传入一个id去映射之,做为索引。这边的Intent和Activity里的Intent一样,我们也可以通过这个来传递参数。
这边有一个需要注意的就是subActivity的启动方式方面的问题:
SingleTop和平时不同,举个例子:a启动b,b启动a,这时候在acitivity的栈里面有个就有了两个a,而在acitivityGroup管理下的SingleTop启动,则是a->b,再b->a,则不会有两个a,则是跳入a的时候call他的newIntent()方法
所以在这边如果你要复用这个界面,我个人觉得可以用singleTop,不仅可以保存它的状态,也可以把后续的操作放在onNewIntent(Intent) 里面,和onCreate区分开来。

给出一段示例代码:
view plain

  • public class AcitivityGroupTestActivity extends ActivityGroup {  
  •     LocalActivityManager activityManager;  
  •     Button b1, b2;  
  •     LinearLayout contain;  

  •     /** Called when the activity is first created. */
  •     @Override
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •         setContentView(R.layout.main);  

  •         activityManager = getLocalActivityManager();  

  •         b1 = (Button) findViewById(R.id.button1);  
  •         b2 = (Button) findViewById(R.id.button2);  

  •         contain = (LinearLayout) findViewById(R.id.contain);  

  •         b1.setOnClickListener(new OnClickListener() {  

  •             @Override
  •             public void onClick(View v) {  
  •                 contain.removeAllViews();  
  •                 Intent in = new Intent(AcitivityGroupTestActivity.this, Activity01.class);  
  •                 in.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
  •                 //in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

  •                 Window mWindow = activityManager.startActivity("1", in);  
  •                 contain.addView(mWindow.getDecorView());  
  •                 Activity a1 = activityManager.getActivity("1");  
  •                 Activity a2 = activityManager.getActivity("2");  
  •                 System.out.println("a1:" + a1 + ",a2:" + a2);  
  •             }  
  •         });  

  •         b2.setOnClickListener(new OnClickListener() {  

  •             @Override
  •             public void onClick(View v) {  
  •                 contain.removeAllViews();  
  •                 Intent in = new Intent(AcitivityGroupTestActivity.this, Activity02.class);  
  •                 in.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
  •                 //in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  •                 Window mWindow = activityManager.startActivity("2", in);  
  •                 contain.addView(mWindow.getDecorView());  
  •                 Activity a1 = activityManager.getActivity("1");  
  •                 Activity a2 = activityManager.getActivity("2");  
  •                 System.out.println("a1:" + a1 + ",a2:" + a2);  
  •             }  
  •         });  

  •     }  
  • }  




布局文件 如下 :

view plain

  • <?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:orientation="horizontal"
  •         android:layout_width="fill_parent"
  •         android:layout_height="wrap_content">
  •         <Button
  •             android:id="@+id/button1"
  •             android:layout_width="wrap_content"
  •             android:layout_height="wrap_content"
  •             android:text="..1..">
  •         </Button>

  •         <Button
  •             android:id="@+id/button2"
  •             android:layout_width="wrap_content"
  •             android:layout_height="wrap_content"
  •             android:text="..2..">
  •         </Button>
  •     </LinearLayout>

  •     <LinearLayout
  •         android:id="@+id/contain"
  •         android:layout_width="fill_parent"
  •         android:layout_height="fill_parent">
  •     </LinearLayout>
  • </LinearLayout>





如果我们要给他们加上跳转,怎么做呢?
一种做法是做在subActivity里面的:
在subActiivity里面获取 getParent() 则就是我们的ActivityGroup,然后通过这个来跳转。
比如在subActivity01里面按button01,跳转到subActivity02,我们可以这么写。
view plain

  • // for parent
  • AcitivityGroupTestActivity parent = (AcitivityGroupTestActivity) getParent();  
  • final LinearLayout contain = (LinearLayout) parent.findViewById(R.id.contain);  
  • contain.removeAllViews();  
  • Intent in = new Intent(getParent(), Activity02.class);  
  • in.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
  • LocalActivityManager manager = parent.getLocalActivityManager();  
  • String currentId = manager.getCurrentId();  
  • Window window = manager.startActivity("2", in);  
  • contain.addView(window.getDecorView());  
  • // 如果有必要可以杀死之前的activity
  • manager.destroyActivity(currentId, true);  



但是要做的通用点,则需要想办法了。
我个人的做法是在ActivityGroup里面注册一个receiver去监听跳转的信息,并且获取参数,我的参数全部封装在一个bundle里,这个是一个统一的格式,当然也可以用自己喜欢的方式。

view plain

  • final static public String LOAD_SUBACTIVITY = "load_subActivity";  
  • final static public String SUBACTIVITY_NAME = "subActivity_name";  
  • final static public String SUBACTIVITY_01 = "subActivity_01";  
  • final static public String SUBACTIVITY_02 = "subActivity_02";  
  • final static public String SUBACTIVITY_PARAM = "subActivity_param";  
  • private BroadcastReceiver receiver = new BroadcastReceiver() {  
  •     @Override
  •     public void onReceive(Context context, Intent intent) {  
  •         // 去接收
  •         String action = intent.getAction();  
  •         if(action.equals(LOAD_SUBACTIVITY)) {  
  •             String subActivityName = intent.getStringExtra(SUBACTIVITY_NAME);  
  •             Bundle param = intent.getBundleExtra(SUBACTIVITY_PARAM);  
  •             loadSubActivity(subActivityName, param);  
  •         }  
  •     }  
  • };  


当然你要注意在ActivityGroup里面去的onCreate去注册监听,和在onDestroy注销之。


view plain

  • public void onCreate(Bundle savedInstanceState) {  
  •         ...  
  •         registerReceiver(receiver, new IntentFilter(LOAD_SUBACTIVITY));  
  •     }  

  •     protected void onDestroy() {  
  •         unregisterReceiver(receiver);  
  •     }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值