0

탭을 사용하고 목록 항목을 클릭 한 후로드 및 활동시 탭을 갖고 싶기 때문에 활동 그룹을 사용하려고합니다. 하지만 다음 줄에 nullpointerexception이 나타납니다.Android ActivityGroup - NullPointerException

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를 얻는 경우 "." 호출합니다 (예 : 'a() .b() .c(). d()'이면 해당 메소드 중 하나가 null을 리턴합니다. 이 전화 번호를 개별 통화로 분할합니다. 'X x = a(); Yy = x.b(); Zz = y.c(); W w = z.d()'이고 어떤 것이 null을 반환하는지 확인하기 위해 검사를 추가하십시오. –

답변

1

저도 같은 문제가 있었다. 첫 번째 대답은 제안을 해결하기 위해 나는 3 선에 멀티 전화 라인을 분해 :

  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로 반환합니다. LocalActivityManager.destroyActivity (...)는 여러 API-에 버그가 포함되어 있기 때문에이 해결 방법이다

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; 
} 

: 내가 사용하고 해결 방법은, 제대로 (해결 후 자세한 설명)이 활동을 파괴하는 반사를 사용하여 버전. 이 방법에서 제대로 활동을 제거하지 않습니다 자사의 HashMap의 (LocalActivityManager's source) :

(마감) 문을 파괴 활동의 LocalActivityRecord을 제거하기 위해 따라야 같은 경우
 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; 
    } 

:

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

그들은 Froyo에 대해 고쳐지고 있다고 말하지만 여전히 삼성 갤럭시 S2에서 실행 중입니다. 2.3.3