ActivityGroup,Activity,TabHost注意问题

最近项目测试版本终于发布了,记录一下项目过程中自己关于子Activity,父Activity和Tabhost之间关系的一系列问题:

1、在子Activity中弹出对话框的时候,我们需要使用getParent()做为Context(在子Activity在其它一些需要用到Context的时候,都需要使用getParent(),因为子Activity在此时是当作一个视图添加到父Activity来使用的);

2、在子Activity与子Activity之间进行跳转,但同时又不需要覆盖TabHost的TabWidget的时候,我们需要用到下面的代码:

[java]  view plain copy
  1. private void startSubActivity() {  
  2.         Intent intent = new Intent(PollingManagementActivity.this,  
  3.                 PollingManagementActivitySub.class);  
  4.         intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
  5.         Holder.linearLayout.removeAllViews();  
  6.         View view = getLocalActivityManager().startActivity(  
  7.                 PollingManagementActivitySub.class.getSimpleName(), intent)  
  8.                 .getDecorView();  
  9.         Holder.linearLayout.addView(view);  
  10.     }  
注意:当我们第一次点击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方法:

[java]  view plain copy
  1. private void startPollingResultActivity(PollingRequestvo pollingRequestvo,  
  2.             int type) {  
  3.         Intent intent = new Intent(PollingManagementActivitySub.this,  
  4.                 PollingResultActivity.class);  
  5.         Bundle bundle = new Bundle();  
  6.         bundle.putSerializable("pollingRequestvo", pollingRequestvo);  
  7.         bundle.putInt("type", type);  
  8.         intent.putExtras(bundle);  
  9.         Holder.viewSwitcher.removeAllViews();  
  10.         View view = ((ActivityGroup) getParent())  
  11.                 .getLocalActivityManager()  
  12.                 .startActivity(PollingResultActivity.class.getSimpleName(),  
  13.                         intent).getDecorView();  
  14.         Holder.viewSwitcher.addView(view);  
  15.         currentActivity = false;  
  16.     }  

这里的view实际是我们的父Activity(ActivityGroup)中的容器。

1.3、getLocalActivityManager().startActivity()前面一个参数PollingManagementActivitySub.class也是在非常重要,我在项目开发的时候,被它坑死了 ,它可以随便设置,但是当我们需要在各个Activity跳转(跳转回来)的时候(并且不要求重新创建新的Activity的时候),这个值必须保证相同,如果要求重新创建Activity,这个值可以不相同。

3、当我们在各个子Activity之间跳转的时候,希望点击返回按钮进行不同的操作,会出现各种出乎意料的操作,我们应该监听返回按钮,再进行具体操作,当然监听返回按钮不是用onBackPress()方法,而是在父类(即ActivityGroup中)调用dispatchKeyEvent这个方法进行监听,这样无论我们在父Activity还是在子Activity中点击按键都会被分发这个按键事件,如果这个事件处理完毕返回true:

如下:

[java]  view plain copy
  1. @Override  
  2.     public boolean dispatchKeyEvent(KeyEvent event) {  
  3.         if (event.getAction() == event.ACTION_DOWN) {  
  4.             switch (event.getKeyCode()) {  
  5.             case KeyEvent.KEYCODE_BACK:  
  6.                 String activityName = getCurrentActivity().getClass()  
  7.                         .getSimpleName();  
  8.                 if (activityName.equals("PollingManagementActivitySub")) {  
  9.                     new AlertDialog.Builder(this)  
  10.                             .setTitle("注意")  
  11.                             .setMessage("确定要退出手机网管吗?")  
  12.                             .setIcon(android.R.drawable.ic_menu_help)  
  13.                             .setPositiveButton("确定",  
  14.                                     new DialogInterface.OnClickListener() {  
  15.                                         public void onClick(  
  16.                                                 DialogInterface dialog,  
  17.                                                 int which) {  
  18.                                             dialog.dismiss();  
  19.                                             finish();  
  20.                                         }  
  21.                                     })  
  22.                             .setNegativeButton("取消",  
  23.                                     new DialogInterface.OnClickListener() {  
  24.                                         public void onClick(  
  25.                                                 DialogInterface dialog,  
  26.                                                 int which) {  
  27.                                             dialog.cancel();  
  28.                                         }  
  29.                                     }).show();  
  30.                 } else if (activityName.equals("PollingResultActivity")) {  
  31.                     LinearLayout container = (LinearLayout) findViewById(R.id.viewSwitcher);  
  32.                     container.removeAllViews();  
  33.                     Intent intent = new Intent(getCurrentActivity(),  
  34.                             PollingManagementActivitySub.class);  
  35.                     intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
  36.                     View view = getLocalActivityManager().startActivity(  
  37.                             PollingManagementActivitySub.class.getSimpleName(),  
  38.                             intent).getDecorView();  
  39.                     container.addView(view);  
  40.                 }  
  41.                 break;  
  42.             }  
  43.         }  
  44.         return true;  
  45.     }  


今天又遇到一个纠结的问题ActivityGroup的子Activity跳转的时候遇到Android2.3.3与Android4.0的不兼容的问题,在Android2.3.3中运行好好的,但是到了Android4.0的时候,出现一个子Activity跳转到另一个Activity的时候,失去焦点的问题。必须在跳转的时候加上下面的代码(在ActivityGroup的dispatchKeyEvent方法中):

[java]  view plain copy
  1. Holder.linearLayout.setFocusable(true);  
  2. Holder.linearLayout.setFocusable(true);  
  3. Holder.linearLayout.requestFocusFromTouch(); 

你可能感兴趣的:(ActivityGroup,Activity,TabHost注意问题)