最近項目測試版本終於發布了,記錄一下項目過程中自己關於子Activity,父Activity和Tabhost之間關係的一系列問題:
1、在子Activity中彈出對話方塊的時候,我們需要使用getParent()做為Context(在子Activity在其它一些需要用到Context的時候,都需要使用getParent(),因為子Activity在此時是當作一個視圖添加到父Activity來使用的);
2、在子Activity與子Activity之間進行跳轉,但同時又不需要覆蓋TabHost的TabWidget的時候,我們需要用到下面的代碼:
private void startSubActivity() {Intent intent = new Intent(PollingManagementActivity.this,PollingManagementActivitySub.class);intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);Holder.linearLayout.removeAllViews();View view = getLocalActivityManager().startActivity(PollingManagementActivitySub.class.getSimpleName(), intent).getDecorView();Holder.linearLayout.addView(view);}
注意:當我們第一次點擊TabWeidget進入Activity的時候,我們需要把第一次進入的Activity當作父Activity,然後在onCreate方法裡也用這種方法跳轉到我們需要的Activity中,這樣方便我們在以後各個子Activity跳轉的時候更容易操作...
上面的代碼的一些個小注意問題:
1.1、intent.setFlags設定成國single_top,表示我們在啟動這個Activity之後,在Activity沒有被銷毀的情況下,不會重新建立一個Activity;
1.2、view 我們無論是在子Activity中跳轉還是從父Activity跳轉到子Activity中,我們這裡的view都是父Activity中的view。這個view被當作一個容器添加和刪除各個Activity
子類中跳轉Activity方法:
private void startPollingResultActivity(PollingRequestvo pollingRequestvo,int type) {Intent intent = new Intent(PollingManagementActivitySub.this,PollingResultActivity.class);Bundle bundle = new Bundle();bundle.putSerializable("pollingRequestvo", pollingRequestvo);bundle.putInt("type", type);intent.putExtras(bundle);Holder.viewSwitcher.removeAllViews();View view = ((ActivityGroup) getParent()).getLocalActivityManager().startActivity(PollingResultActivity.class.getSimpleName(),intent).getDecorView();Holder.viewSwitcher.addView(view);currentActivity = false;}
這裡的view實際是我們的父Activity(ActivityGroup)中的容器。
1.3、getLocalActivityManager().startActivity()前面一個參數PollingManagementActivitySub.class也是在非常重要,我在項目開發的時候,被它坑死了 ,它可以隨便設定,但是當我們需要在各個Activity跳轉(跳回來)的時候(並且不要求重新建立新的Activity的時候),這個值必須保證相同,如果要求重新建立Activity,這個值可以不相同。
3、當我們在各個子Activity之間跳轉的時候,希望點擊返回按鈕進行不同的操作,會出現各種出乎意料的操作,我們應該監聽返回按鈕,再進行具體操作,當然監聽返回按鈕不是用onBackPress()方法,而是在父類(即ActivityGroup中)調用dispatchKeyEvent這個方法進行監聽,這樣無論我們在父Activity還是在子Activity中點擊按鍵都會被分發這個按鍵事件,如果這個事件處理完畢返回true:
如下:
@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {if (event.getAction() == event.ACTION_DOWN) {switch (event.getKeyCode()) {case KeyEvent.KEYCODE_BACK:String activityName = getCurrentActivity().getClass().getSimpleName();if (activityName.equals("PollingManagementActivitySub")) {new AlertDialog.Builder(this).setTitle("注意").setMessage("確定要退出手機網管嗎?").setIcon(android.R.drawable.ic_menu_help).setPositiveButton("確定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {dialog.dismiss();finish();}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {dialog.cancel();}}).show();} else if (activityName.equals("PollingResultActivity")) {LinearLayout container = (LinearLayout) findViewById(R.id.viewSwitcher);container.removeAllViews();Intent intent = new Intent(getCurrentActivity(),PollingManagementActivitySub.class);intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);View view = getLocalActivityManager().startActivity(PollingManagementActivitySub.class.getSimpleName(),intent).getDecorView();container.addView(view);}break;}}return true;}
今天又遇到一個糾結的問題ActivityGroup的子Activity跳轉的時候遇到Android2.3.3與Android4.0的不相容的問題,在Android2.3.3中運行好好的,但是到了Android4.0的時候,出現一個子Activity跳轉到另一個Activity的時候,失去焦點的問題。必須在跳轉的時候加上下面的代碼(在ActivityGroup的dispatchKeyEvent方法中):
Holder.linearLayout.setFocusable(true);Holder.linearLayout.setFocusable(true);Holder.linearLayout.requestFocusFromTouch();