Android完成儿童活动错误

问题描述:

我正在开发一个项目,我需要在Tabhost中的一个Tab下放置一些活动。我正在使用自定义的tabgroupactivity示例,我可以在互联网上找到某处,但现在我在完成我的活动时遇到了一些小问题。首先这里是自定义类代码:Android完成儿童活动错误

import java.util.ArrayList; 

import android.app.Activity; 
import android.app.ActivityGroup; 
import android.app.LocalActivityManager; 

import android.content.Intent; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.Window; 

/* 
* The purpose of this Activity is to manage the activities in a tab. 
* Note: Child Activities can handle Key Presses before they are seen here. 
* @author Eric Harlow 
*/ 
public class TabGroupActivity extends ActivityGroup { 

    private ArrayList<String> mIdList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     if (mIdList == null) mIdList = new ArrayList<String>(); 
    } 

    /* 
    * This is called when a child activity of this one calls its finish method. 
    * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity 
    * and starts the previous activity. 
    * If the last child activity just called finish(),this activity (the parent), 
    * calls finish to finish the entire group. 
    */ 
    @Override 
    public void finishFromChild(Activity child) { 
     LocalActivityManager manager = getLocalActivityManager(); 
     int index = mIdList.size()-1; 

     if(index < 1) { 
       finish(); 
       return; 
     } 
     manager.destroyActivity(mIdList.get(index), true); 
     mIdList.remove(index); 
     index--; 
     String lastId = mIdList.get(index); 
     Intent lastIntent = manager.getActivity(lastId).getIntent(); 
     Window newWindow = manager.startActivity(lastId, lastIntent); 
     setContentView(newWindow.getDecorView()); 

    } 

    /* 
    * Starts an Activity as a child Activity to this. 
    * @param Id Unique identifier of the activity to be started. 
    * @param intent The Intent describing the activity to be started. 
    * @throws android.content.ActivityNotFoundException. 
    */ 
    public void startChildActivity(String Id, Intent intent) {  
     Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     if (window != null) { 
      mIdList.add(Id); 
      setContentView(window.getDecorView()); 
     }  
    } 

    /* 
    * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR 
    * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown. 
    */ 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    /* 
    * Overrides the default implementation for KeyEvent.KEYCODE_BACK 
    * so that all systems call onBackPressed(). 
    */ 
    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      onBackPressed(); 
      return true; 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

    /* 
    * If a Child Activity handles KeyEvent.KEYCODE_BACK. 
    * Simply override and add this method. 
    */ 
    @Override 
    public void onBackPressed() { 
     int length = mIdList.size(); 
     if (length >=1) { 
      Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); 
      current.finish(); 
     } 
    } 
} 

所以基本上我的问题是,当我有一个tabhost 5个标签。在第一个标签中,我有3个儿童活动,我们称它们为ActivityABC。以下是有关的活动之间连接的小资料:

A --- can start -->B and C 
B --- can start -->A and C 
C --- can start -->A and B 

,我开始他们是这样的:

Intent previewMessage = new Intent(A.this, C.class); 
previewMessage.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
parentActivity.startChildActivity("ExpectSoon", previewMessage); 

这里是问题:当我开始了几次A,B,CA-->B-->C-->B-->C-->A-->C等有没有问题......但是当我按下返回按钮,我在这条线从我TagGroupActivity得到一个NullPointerException异常:

Intent lastIntent = manager.getActivity(lastId).getIntent(); 

这里是logcat的输出:

10-05 10:51:30.995: ERROR/AndroidRuntime(20377): java.lang.NullPointerException 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.stampii.stampii.TabGroupActivity.finishFromChild(TabGroupActivity.java:49) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.app.Activity.finish(Activity.java:3420) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.stampii.stampii.TabGroupActivity.onBackPressed(TabGroupActivity.java:104) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.stampii.stampii.TabGroupActivity.onKeyUp(TabGroupActivity.java:89) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.KeyEvent.dispatch(KeyEvent.java:1527) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.app.Activity.dispatchKeyEvent(Activity.java:2210) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1779) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:811) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:811) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:811) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.widget.TabHost.dispatchKeyEvent(TabHost.java:278) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:811) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:811) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1812) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1160) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.app.Activity.dispatchKeyEvent(Activity.java:2205) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1779) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2758) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2730) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1999) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.os.Looper.loop(Looper.java:150) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at android.app.ActivityThread.main(ActivityThread.java:4293) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
10-05 10:51:30.995: ERROR/AndroidRuntime(20377):  at dalvik.system.NativeStart.main(Native Method) 

任何想法如何解决这个问题?

+0

检查manager.getActivity(lastId).getIntent()为空或不是?????? –

+0

的确是这样,这就是为什么它的肆意我在该行一个NullPointerException异常,但我不知道如何解决这个问题,这就是为什么我问这里这个问题 –

+0

空指针异常从来没有抛出,因为你访问空对象或空变量,它的价值是需要你的代码,所以....我正在研究这个错误,但是当这个错误发生?当你打电话给这个活动可能是你的意图是错误的开始活动... –

我认为你必须象这样开始

Intent intent = new Intent(A.this,B.class); 
      TabGroupActivity parent=(TabGroupActivity)getParent(); 

      parent.startChildActivity("msg",intent); 
+0

我得到同样的例外,所以它是无关紧要,如果我设置标志或不。 –

Intent check= new Intent(getParent(),abcintent.class); 
    TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
parentActivity.startChildActivity("abcActiivty", check); 

我得到了同样的问题。

但调试完毕后,我才知道,行

parentActivity.startChildActivity(STRING_ID, intent); 

负责NullPointerException

那是因为,您可能会使用相同的STRING_ID来启动多个子活动。所以当onBackPressedSTRING_ID的意图从列表中删除。

你应该叫startChildActivity的方式是

parentActivity.startChildActivity(UNIQUE_STRING_ID, intent); 

UNIQUE_STRING_ID必须是不同的

+0

谢谢。我使用STRING_ID作为系统当前时间millisecound.tabgroup.startChildActivity(“”+ System.currentTimeMillis(),i); – Hemant