마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SupportMapFragment.newInstance().getMap() 이 null로 리턴됩니다. [closed]

0 추천
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
		ft.replace(R.id.mapview_layout, SupportMapFragment.newInstance(), "map");
		ft.commit();
		mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentByTag("map");
		
		googleMap = mapFragment.getMap();

구조상 xml에 MapFragment를 넣으니 IllegalStateException이 발생하여 자바 코드로 동적으로 MapFragment를 추가 시켰습니다. 

그런데 MapFragment의 추가는 잘 되지만 보시다시피 위의 소스에서 mapFragment.getMap()을 할경우 null을 리턴해 버립니다. 혹시 해결방법 아시는분 계신가요??

질문을 종료한 이유: 자답
갈무리 (12,430 포인트) 님이 2013년 3월 26일 질문
갈무리님이 2013년 3월 27일 closed
저도 많이 해맸는데, 저 같은 경우엔 핸들로를 안쓰고 해결했어요.
늦었지만 참고하시면 혹시 도움이 될까..

layout xml에서 com.google.android.gms.maps.MapFragment 를 사용하여 fragment를 띄었는데,
com.google.android.gms.maps.SupportMapFragment 으로 사용하면
위같은 문제가 안생기네요. 미리 layout에서 읽고 setContentView에서 처리되기 때문에..
참고로 전 google map api v2 입니다.
감사합니다...........!!!!!

1개의 답변

0 추천
 
채택된 답변

자답입니다.

 

SupportMapFragment.newInstance()를 한뒤 getMap()호출할 경우 

아직 newInstance()를 하면서 GoogleMap객체 자체가 생성이 끝나지 않은 상태일 수도 있기 때문에 Null을 리턴 한다고 합니다.

따라서 해결 방법은 약간의 시간차이를 두고 getMap()함수를 호출하면 됩니다.

아래 코드와 같습니다.

 

mapFragment = SupportMapFragment.newInstance();
		FragmentTransaction ft = getChildFragmentManager().beginTransaction();
		ft.replace(R.id.mapview_layout, mapFragment, "map");
		ft.commit();

new Handler().postDelayed(new Runnable() {
			
			@Override
			public void run() {
				try{
					googleMap = mapFragment.getMap();
					
				}catch(NullPointerException e)
				{
					e.printStackTrace();
				}
			}
		}, 3000);

-------------------------------------------------------------------------------원문 --------------------------------------------------------------------------

 

public final GoogleMap getMap ()

 

Gets the underlying GoogleMap that is tied to the view wrapped by this fragment.

Returns

 

갈무리 (12,430 포인트) 님이 2013년 3월 26일 답변
갈무리님이 2013년 4월 8일 채택됨
...