2012-06-13 4 views
2
나는 내 문제를 설명하려고합니다

: 내 모든 조각 내 활동에 (참) setRetainInstance를 사용하는안드로이드 : 화면 방향 변경 fragment.getActivity에 null의

내가이 일을하고있어에서 onCreate :

if (savedInstanceState == null) { 
     fragment = onCreatePane(); 
     fragment.setArguments(intentToFragmentArguments(getIntent())); 

     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.add(R.id.root_container, fragment, getFragmentTag()); 
     trans.commit(); 
    } else { 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     if (fragment == null) { 

      fragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag()); 
     } 

     if (fragment == null) { 
      fragment = onCreatePane(); 
      fragment.setArguments(intentToFragmentArguments(getIntent())); 
     }   

     trans.add(R.id.root_container, fragment, getFragmentTag()); 
     trans.commit(); 

    } 

그래서 활동을 만들고 savedInstance가 null 일 때 조각을 만들고 매개 변수를 설정하고 트랜잭션을 시작하고 자체 조각으로 트랜잭션에 내 조각을 추가합니다 (나중에 다시 가져 오기 위해).

사용자는 활동과 상호 작용하고 방향을 변경합니다. 활동은 파괴되고 재창조됩니다 (평상시와 마찬가지로 활동적으로). 이제 else를 입력하면 조각이 null이고 조각 관리자가 보유한 올바른 조각을 반환하는 fragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag());을 수행합니다.

문제는이 조각이 파괴 된 이전 활동에 대한 참조를 보유하기 때문에 fragment.getActivity를 수행하면 null이 반환된다는 것입니다. 어떻게 acitivy에 대한 조각 참조를 새롭게 재 작성된 Activity로 업데이트 할 수 있습니까?

업데이트 : : 더 정확하게는 새로운 검색을 얻을 때 onNewIntent를 호출하는 SearchActivity입니다. 따라서 실제 상호 작용은 다음과 같습니다 -> 사용자가 검색을 수행합니다 -> 검색이 올바르게 표시됩니다 -> 사용자가 방향을 바꾸면 결과가 올바르게 표시됩니다 (사용자가 검색 결과와 상호 작용하면) -> 사용자가 검색 버튼에서 새 검색을 수행하고 검색 로직을 가진 프래그먼트에 새로운 인 텐트를 디스패치하는 SearchActivity의 onNewIntent를 호출합니다. 액티비티에 대한 참조가 null이기 때문에 여기에서 충돌합니다

답변

0

단지

+0

화면 방향이 바뀌면 항상 조각 참조가 fragment = getSupportFragmentManager()로 업데이트됩니다. findFragmentByTag (getFragmentTag()); 또한 NOT NULL 부분을 반환합니다. 문제는 액티비티에 대한 프래그먼트 참조가 여전히 null이라는 것입니다 (새롭게 생성 된 것으로 다시 업데이트되지는 않을 것입니다) – StErMi

+0

괜찮습니다. orietnation이 변경되면 null로 변하기 쉬운 변수가 생깁니다. ...... 나는 방금 전에 "if (savedInstanceState == null) {" –

+0

"당신이 우리에게 더 많은 코드를 제공 할 수 있다면 더 좋을 것이라고 생각하기 때문에 ... –

1

언제 어디서 getActivity()을 부르십니까? 활동 참조는 자동으로 업데이트되지만 즉시 업데이트되지는 않습니다. onActivityCreated()이 호출 된 후에는 액세스하는 것이 안전해야합니다. 네,이 솔루션의 - (참) setRetainInstance이 경우

+0

가 getActivity가 조각에 onNewIntent를 호출 acitivty의 onNewIntent에 사용되는 더 정확합니다. – StErMi

+0

정확히 onNewIntent가 호출되면? 오리엔테이션 변경이 원인이되지 않으므로 수동으로 호출하는 것 같습니다. 어쨌든, 너무 일찍 시작한 것 같습니다. 조각을 만들어서 그것을 말할 필요가있는 것을 기억하고 onActivityCreated가 호출 될 때 동작 시키십시오. –

+0

더 정확히 말하면 나는 새로운 Search를 얻을 때 onNewIntent를 호출하는 SearchActivity입니다. 따라서 실제 상호 작용은 다음과 같습니다 -> 사용자가 검색을 수행합니다 -> 검색이 올바르게 표시됩니다 -> 사용자가 방향을 바꾸면 결과가 올바르게 표시됩니다 (사용자가 검색 결과와 상호 작용하면) -> 사용자가 검색 버튼에서 새 검색을 수행하고 검색 로직을 가진 프래그먼트에 새로운 인 텐트를 디스패치하는 SearchActivity의 onNewIntent를 호출합니다.여기 액티비티에 대한 참조가 null이기 때문에 충돌이 발생합니다. – StErMi

0

...... 방향 변경에 만든 새 것으로 업데이트 조각을 보자 ...... 다른 부분 if (fragment == null) { fragment = getSupportFragmentManager(에서 NULL 체크를 제거 (태그를 사용하여 조각을 찾으려면 다시 인스턴스화하는 것이 잘못된 방법입니다 - 진행중인 백그라운드 루틴이있을 수 있습니다). 그렇지 않으면 setRetainInstance (false)가있는 경우 문제가 다시 발생할 수 있습니다. 나는 비슷한 것을 가지고 있었다. 내 경우 - 로더를 사용했기 때문에 (백그라운드에서). 해결책은 간단했다. 단편의 onDestroy() 메소드에서 단편의 로더를 파괴했다.

0

당신의 baseAcvivity에서이 문제를 해결하기 위해 onSaveInstanceStat을 재정의 할 수

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //solution of fragment.getActivity() is null 
    outState.remove("android:support:fragments"); 
}