2014-05-25 4 views
0

내 주요 활동에는 Google지도 v2지도 조각과 사용자가 워크 플로를 탐색 할 때 바뀌는 다른 하나의 조각이 있습니다. 액티비티는 권장되는 이중 확인 접근 방식을 사용하여 GoogleMap 인스턴스를 가져옵니다. 조각은 모두지도 인스턴스를 조작하고 마커 및/또는 카메라 변경 리스너를 추가해야합니다. 그래서 ... 어떻게 조각이 안정적으로지도에 대한 참조를 얻을 수 있습니까? (? 일반적으로 또는, 활동에 속한 비 Parcelable 것)조각은 어떻게 활동의 GoogleMap을 얻을 수 있습니까?

권장 패턴 :

조각이 가정되는이 활동을 통해 서로 통신합니다. 프래그먼트에서 다시 호출 할 수있는 인터페이스를 구현하도록 액티비티를 설정하는 것이 좋습니다. 그래서 나는 액티비티에 추가되었을 때 조각들이 호출 할 내 작업을 getMap() 메쏘드에 부여하고, 맵이 초기화 된 후에 만 ​​프래그먼트를 만들고 추가한다고 해봅시다.

액티비티가 프레임 워크에 의해 파괴되고 다시 생성되는 경우 (예 : 장치가 회전 된 경우)에도이 접근 방식이 작동합니까? 내 의심의 여지가 내 활동의 onCreate()/onResume(), 또는 일부 프레임 워크 부두에 의해 조각을 때로는 다시 만들 수 있습니다, 유효한지도 인스턴스없이 떠날 것인지 조각에 의해 재현됩니다 여부입니다. (단편화 은 때로는 부두가 만든입니다. 그렇기 때문에 명시 적 생성자가없는 것으로 생각됩니다.)

답변

0

이것은 내가이 문제를 해결 한 방법입니다. 개발자 옵션에서 "활동을 유지하지 마십시오"를 선택하더라도 작동하는 것으로 보입니다. 이 솔루션이 좋거나 나쁘거나 이상한 경우 여전히 듣고 싶습니다.

프래그먼트가 어떻게 다시 만들어지고 연결 되더라도 프래그먼트의 onResume()이 호출 될 때까지 해당 액티비티의 맵을 얻은 것입니다 (얻은 경우).

public class FooFragment extends Fragment { 
    private GoogleMap map; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_foo, container, false); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     MainActivity a = (MainActivity) getActivity(); 
     map = a.map; 
     if(map != null) { 
      // TODO register listeners 
     } 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if(map != null) { 
      // TODO unregister listeners 
     } 
    } 

} 

그리고 이것은 onCreate()onResume() 모두에서 호출 활동의 initMap()입니다 :

private void initMap() { 
    if(map == null) { 
     map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
     if(map != null) { 
      // TODO configure map 
      setFragment(); // attaches the appropriate fragment 
     } 
    } 
} 
관련 문제