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