SupportMapFragment getMap() возвращает null
Я пытаюсь создать SupportMapFragment
динамически и поместить его в контейнер FrameLayout
.
Моя проблема в том, что mMapFragment.getMap()
возвращает null
...
Кто-нибудь может помочь?
CenterMapFragment.java
public class CenterMapFragment extends Fragment {
private SupportMapFragment mMapFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.center_map_fragment, container, false);
}
@Override
public void onActivityCreated (Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()) == ConnectionResult.SUCCESS) {
setUpMapIfNeeded();
}
}
private void setUpMapIfNeeded() {
if (mMapFragment == null) {
mMapFragment = SupportMapFragment.newInstance();
FragmentTransaction fragmentTransaction =
getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.map, mMapFragment);
fragmentTransaction.commit();
setUpMap();
}
}
private void setUpMap() {
GoogleMap map = mMapFragment.getMap();
// map is null!
}
@Override
public void onResume()
{
super.onResume();
setUpMapIfNeeded();
}
}
center_map_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
<Button
android:id="@+id/btn_loc"
android:layout_width="60dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/locbtn" />
</RelativeLayout>
Ответы
Ответ 1
commit()
на FragmentTransaction
не выполняет свои операции немедленно. Когда вы назовете setUpMap()
, onCreateView()
не будет вызываться на SupportMapFragment
, и, следовательно, там
пока не будет карты.
Один из подходов состоит в том, чтобы не использовать вложенные фрагменты, вместо этого вместо него следует иметь CenterMapFragment
extend SupportMapFragment
, и в этом случае getMap()
должен работать в любое время после onCreateView()
(например, onActivityCreated()
).
Ответ 2
В следующей ссылке MapView используется, как CommonsWare предлагает в последней части своего комментария:
http://ucla.jamesyxu.com/?p=287
public class MapFragment extends Fragment {
MapView m;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflat and return the layout
View v = inflater.inflate(R.layout.map_fragment, container, false);
m = (MapView) v.findViewById(R.id.mapView);
m.onCreate(savedInstanceState);
return v;
}
@Override
public void onResume() {
super.onResume();
m.onResume();
}
@Override
public void onPause() {
super.onPause();
m.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
m.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
m.onLowMemory();
}
}
Я надеюсь, что это будет полезно.
Ответ 3
Вызов
fragmentTransaction.commit();
является асинхронным, карта не будет готова, когда вы вернетесь от нее. Просто позвоните
getFragmentManager().executePendingTransactions();
в качестве следующей строки, которая сделает его синхронным и выполнит его для следующей команды, чтобы правильно отобразить законченную карту. Если вы беспокоитесь о времени, которое требуется, поместите всю инициализацию в AsyncTask
и покажите индикатор прогресса пользователю во время инициализации карты.