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>


 

發佈了51 篇原創文章 · 獲贊 46 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章