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>