最近项目测试版本终于发布了,记录一下项目过程中自己关于子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);
- }
上面的代码的一些个小注意问题:
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:
如下:
- @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();