Android ActivityGroup和TabActivity搭配使用及遇到的一些问题

ActivityGroup和TabActivity的搭配使用

1.用途

如果你有一个AActivity是在TabActivity的tab中的,然后想跳转到BActivity,并且当前的tab页面还是要保留显示的,就可以使用ActivityGroup

 

2.使用介绍

首先你要有一个类继承ActivityGroup,这个类叫做ParentActivity,然后把ParentActivity加入到你的TabActivity的tab中去,然后在ParentActivity的layout中定义LinearLayout,要把LinearLayout的id加上,id可以随便写的,后面会用到。

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/myactivitygoup_view"
    >

</LinearLayout>

 

然后在ParentActivity的onCreate方法中调用initView方法进行跳转到AActivity,我这个自己在Util类中封装了一个gotoNextActivity的方法

注意:ParentActivity也要在Manifest文件中注册,因为这也是一个Activity.

这个是在ParentActivity里的initView()方法,里面调用了gotoNextActivity()方法。

	private void initView()
	{
		Intent intent=new Intent(ParentActivity.this,AActivity.class);
		Util.gotoNextActivity(this, intent, "AActivity");
	}

 

这个是Util类中的gotoNextActivity方法

public static void gotoNextActivity(ActivityGroup group,Intent intent,String nextName)
	{
		LinearLayout container = (LinearLayout) group.getWindow().findViewById(R.id.myactivitygoup_view);// 注意这里,还是获取group的view
		container.removeAllViews();
		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//跳转到下一个activity
		//intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
		Window subActivity = group.getLocalActivityManager().startActivity(nextName, intent);
		View view = subActivity.getDecorView();
		container.addView(view);
		LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
		params.width = LayoutParams.FILL_PARENT;
		params.height = LayoutParams.FILL_PARENT;
		view.setLayoutParams(params);
	}


注意:使用gotoNextActivity的时候需要一个ActivityGroup参数。因为ParentActivity是ActivityGroup的子类所以可以使用this。AAcitivity跳转到BAcitivity的时候,可以这样。

Intent intent=new Intent(AActivity.this,BActivity.class);
Util.gotoNextActivity((ActivityGroup)getParent(), intent, "BActivity");

 

下面是回退的方法

	public static void gotoBackActivity(ActivityGroup group,Intent intent,String backName)
	{
		LinearLayout container = (LinearLayout)group.getWindow().findViewById(R.id.myactivitygoup_view);
		container.removeAllViews();
		intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//回调到前一个activity
		intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
		Window subActivity = group.getLocalActivityManager().startActivity(backName, intent);
		View view  = subActivity.getDecorView();
		container.addView(view);
		LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
		params.width = LayoutParams.FILL_PARENT;
		params.height = LayoutParams.FILL_PARENT;
		view.setLayoutParams(params);
	}


然后在BActivity中调用

 

Intent intent=new Intent(BActivity.this,AActivity.class);
Util.gotoBackActivity((ActivityGroup)getParent(), intent, "AActivity");

注意:在回退和跳转的时候不用调用finish()方法,不然整个ActivitGroup都会结束的。

 

3.使用ActivityGroup遇到的一些问题

1.在ParentActivity的子项AAcitivity中调用AlertDialog,没有反应。

解决方法:在创建AlerttDialogBuilder的要是使用getParent()

AlertDialog.Builder builder=new AlertDialog.Builder((ActivityGroup)getParent());

2.在AAcitivity中不能监听到返回键事件。

解决方法:

在ParentActivity中重写dispatchKeyEvent方法

<span style="font-size:12px;">@Override
	public boolean dispatchKeyEvent(KeyEvent event)
	{
		// TODO Auto-generated method stub
		 if(event.getAction()==KeyEvent.ACTION_DOWN&&event.getKeyCode()==KeyEvent.KEYCODE_BACK){  
            // getLocalActivityManager().getActivity(CURID).onKeyDown(event.getKeyCode(), event);
			return getLocalActivityManager().getCurrentActivity().onKeyDown(event.getKeyCode(), event);
            }      
		return super.dispatchKeyEvent(event);
	}</span>


然后在AActivity中重写onKeyDown方法

<span style="font-size:12px;">@Override
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		// TODO Auto-generated method stub
		if(event.getKeyCode()==KeyEvent.KEYCODE_BACK){  
            // getLocalActivityManager().getActivity(CURID).onKeyDown(event.getKeyCode(), event);
			 AlertDialog.Builder builder=new AlertDialog.Builder((ActivityGroup)getParent());
				builder.setTitle("提示");
				builder.setMessage("确定要退出程序吗?");
				builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
				{
					@Override
					public void onClick(DialogInterface dialog, int which)
					{
						// TODO Auto-generated method stub
						 android.os.Process.killProcess(android.os.Process.myPid()); // 结束进程
					}
				}).setNegativeButton("取消", new DialogInterface.OnClickListener()
				{
					@Override
					public void onClick(DialogInterface dialog, int which)
					{
						// TODO Auto-generated method stub
					}
				});
				builder.show();
				return false;
            }      
		return super.onKeyDown(keyCode, event);
	}
</span>


3.在AActivity中使用startActivitForResult到BActivity后,在onActivityResult()方法中接收不到BActivity的反馈。

解决方法:

在ParentActivity中重写onActivityResult()方法,在AActivity中自己定义一个handleActivityResult的方法

<span style="font-size:14px;">	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode==0){ 
           AActivity activity=(AActivity)getLocalActivityManager().getCurrentActivity();
           activity.handleActivityResult(requestCode, resultCode, data);//把收到的消息发送给发起请求的Activity AActivity 
		}
	}</span>

 

这个是handleActivityResult方法,然后就可以在这个方法里面进行一些操作

<span style="font-size:14px;">public void handleActivityResult(int requestCode, int resultCode, Intent data){ 
        if(resultCode == RESULT_OK){//获取返回码,刷新界面 
               Log.i("MXH", "返回码:"+resultCode); 
        	        } </span>


4.在AActivity中无法监听到menu键

解决方法:

在ParentActivity中重写dispatchKeyEvent方法

<span style="font-size:12px;">@Override
	public boolean dispatchKeyEvent(KeyEvent event)
	{
	 if(event.getAction()==KeyEvent.ACTION_DOWN&&event.getKeyCode()==KeyEvent.KEYCODE_MENU)
		 {
			 getLocalActivityManager().getCurrentActivity().openOptionsMenu();
		 }
		return super.dispatchKeyEvent(event);
	}</span>


 

你可能感兴趣的:(android)