最近项目测试版本终于发布了,记录一下项目过程中自己关于子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; }
1.3、getLocalActivityManager().startActivity()前面一个参数PollingManagementActivitySub.class也是在非常重要,我在项目开发的时候,被它坑死了 ,它可以随便设置,但是当我们需要在各个Activity跳转(跳转回来)的时候(并且不要求重新创建新的Activity的时候),这个值必须保证相同,如果要求重新创建Activity,这个值可以不相同。
3、当我们在各个子Activity之间跳转的时候,希望点击返回按钮进行不同的操作,会出现各种出乎意料的操作,我们应该监听返回按钮,再进行具体操作,当然监听返回按钮不是用onBackPress()方法,而是在父类(即ActivityGroup中)调用dispatchKeyEvent这个方法进行监听,这样无论我们在父Activity还是在子Activity中点击按键都会被分发这个按键事件,如果这个事件处理完毕返回true:
如下:
@Override public 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();