0

我想要使用活動組 - 因爲我使用標籤,並希望有加載時的標籤和列表項被點擊後的活動。但我得到在下面的行nullpointerexception:Android ActivityGroup - 空指針異常

View view1 = S1_Group.group.getLocalActivityManager() 
          .startActivity("S1", intent) 
          .getDecorView(); 

代碼是..。

lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 


     Intent intent = new Intent(getApplicationContext(), S1.class); 

     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     Log.d("test","Before view"); 
     try{ 
      View view1 = S1_Group.group.getLocalActivityManager() 
       .startActivity("S1", intent) 
       .getDecorView(); 
       Settings_Group.group.setContentView(view1);  
     } 
     catch (Exception e){ 
      Log.e("test","view failded:"+e); 
     } 
.... 

更新:這是我的小組活動是如何。我找不到什麼問題,

public class S1_Group extends ActivityGroup { 

    public static S1_Group group; 
    private ArrayList<View> history; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     this.history = new ArrayList<View>(); 
     group = this; 

     View view = getLocalActivityManager().startActivity("F1", 
       new Intent(this, F1.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 

     setContentView(view); 
    } 
} 
+1

基本調試步驟:如果你在一條有多條鏈的線上獲得NPE「。」調用,例如().b().c().d()`,那麼這些方法中的其中一個可能返回null。將此線路拆分爲單個呼叫,例如`X x = a(); Y y = x.b(); Z z = y.c(); W w = z.d()`,並添加檢查以查看哪一個返回null。 – 2011-02-06 20:35:55

回答

1

我有同樣的問題。爲了解決它,我分解了多方通話行成三行作爲第一個答案建議:

  LocalActivityManager processManager =activityGroup.group.getLocalActivityManager(); 
      Window w = processManager.startActivity("ActivityOne", myIntent); 
      View view = w.getDecorView(); 

然後發現,第一行是一個問題。因爲我從活動組以外的活動(它是不同選項卡下的活動)調用ActivityOne,所以靜態「activityGroup.group ....」尚未初始化。所以相當不錯的解決方法是在啓動意圖之前切換到該選項卡並返回到此選項卡。因此,在上面的代碼之前添加以下內容:

  AppName.switchToTab(2); 
      AppName.switchToTab(1); 

這樣做的技巧,你不能看到選項卡開關。一個更整潔的解決方案可能會切換到啓動時的所有選項卡,以確保它們都被初始化...

1

遇到同樣的問題,似乎有(或有)與LocalActivityManager發生的錯誤當您嘗試(重新)啓動一個具有與先前銷燬的活動相同的ID的活動時。由於destroyActivity方法中的bug,它將僅返回null作爲Window。我使用的解決方法,使用反射來妥善銷燬活動(解決方法後,詳細的說明):

public boolean destroyActivityWorkAround(String id) { 
    final LocalActivityManager activityManager = getLocalActivityManager(); 
    if(activityManager != null){ 
     activityManager.destroyActivity(id, false);    
     try { 
      // Use reflection to get to the HashMaps with the records(which activities are started ect.) 
      // to remove the records properly 
      // http://code.google.com/p/android/issues/detail?id=10083 
      final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities"); 
      if(mActivitiesField != null){ 
       mActivitiesField.setAccessible(true); 
       @SuppressWarnings("unchecked") 
       final Map<String, Object> mActivities = (Map<String, Object>)mActivitiesField.get(activityManager); 
       if(mActivities != null){ 
        mActivities.remove(id); 
       } 
       final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray"); 
       if(mActivityArrayField != null){ 
        mActivityArrayField.setAccessible(true); 
        @SuppressWarnings("unchecked") 
        final ArrayList<Object> mActivityArray = (ArrayList<Object>)mActivityArrayField.get(activityManager); 
        if(mActivityArray != null){ 
         for(Object record : mActivityArray){ 
          final Field idField = record.getClass().getDeclaredField("id"); 
          if(idField != null){ 
           idField.setAccessible(true); 
           final String _id = (String)idField.get(record); 
           if(id.equals(_id)){ 
            mActivityArray.remove(record); 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      Log.e(LOGTAG, this.getClass().getSimpleName() + ".destroyActivityWorkAround() removing activity using reflection failed with error:", e); 
      //e.printStackTrace(); 
     } 
     return true; 
    } 
    return false; 
} 

這是一種解決方法,因爲LocalActivityManager.destroyActivity(...)包含幾個API - 一個bug版本。該方法不會正確地刪除活動的HashMap中的(LocalActivityManager's source):

 public Window destroyActivity(String id, boolean finish) { 
     LocalActivityRecord r = mActivities.get(id); //<-- id's are the key's for the HashMap 
     Window win = null; 
     if (r != null) { 
      win = performDestroy(r, finish); 
      if (finish) { 
        mActivities.remove(r); //--> This works on id's not the 'r object', this doesn't remove anything 
      } 
     } 
     return win; 
    } 

的,如果(結束)語句應遵循刪除活動的LocalActivityRecord被破壞:

if (finish) { 
    mActivities.remove(id); //--> mActivities should remove the id 
    mActivityArray.remove(r); //--> mActivitiesArray should remove the 'r object' (LocalActivityRecord) 
} 

雖然他們說這是固定的Froyo,但我仍然遇到了一個三星Galaxy S2運行2.3.3