2011-10-05 138 views
1

我正在開發一個項目,我需要在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

空指針異常從來沒有拋出,因爲你訪問空對象或空變量,它的價值是需要你的代碼,所以....我正在研究這個錯誤,但是當這個錯誤發生?當你打電話給這個活動可能是你的意圖是錯誤的開始活動... –

回答

0

我認爲你必須象這樣開始

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

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

我得到同樣的例外,所以它是無關緊要,如果我設置標誌或不。 –

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

我得到了同樣的問題。

但調試完畢後,我才知道,行

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