FindFragmentById для SupportMapFragment возвращает null в Android Studio

Недавно я перенес проект из Eclipse в Android Studio. Все настроено и работает отлично, за исключением одного моего фрагмента, который использует SupportMapFragment. Ниже findFragmentById (который работал при создании в Eclipse) теперь возвращает null 🙁

public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); SupportMapFragment m = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.safety_map)); 

Фрагмент xml …

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <fragment android:id="@+id/safety_map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginBottom="40dp" map:cameraTargetLat="@string/livesafe_latitude" map:cameraTargetLng="@string/livesafe_longitude" map:uiZoomControls="false" class="com.google.android.gms.maps.SupportMapFragment"/> 

Вот мои зависимости в моем build.gradle:

  dependencies { //google analytics compile 'com.google.apis:google-api-services-analytics:v3-rev103-1.19.0' //support library for api 10 compile 'com.android.support:support-v4:21.0.0' //google play services compile 'com.google.android.gms:play-services:6.1.11' compile project(':facebook') compile files('libs/android-support-multidex.jar') compile files('libs/aws-android-sdk-1.6.0-debug.jar') compile files('libs/FlurryAnalytics_3.3.2.jar') } 

Я не изменил код в xml-файле или классе Fragment, который ранее работал в Eclipse.

Судя по тому, что вы переопределяете Fragment.onActivityCreated() , я полагаю, что ваш макет, содержащий фрагмент карты, является макетом для вашего Fragment . В этом случае SupportMapFragment является дочерним фрагментом вашего Fragment хостинга. Когда вы пытаетесь восстановить его, вы используете Activity FragmentManager . Вместо этого вы должны использовать Fragment FragmentManager :

Например, это:

 SupportMapFragment m = ((SupportMapFragment) getActivity() .getSupportFragmentManager().findFragmentById(R.id.safety_map)); 

будет выглядеть так:

 SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map)); 

Да. Это не работает для targetSdkVersion 21, если фрагмент вашей карты является внутренней частью фрагмента (из-за некоторых проблем, которые упомянули это и это ).

Поскольку временное разрешение может дать совет такой трюк:

 public class MyFragment extends Fragment { private SupportMapFragment fragment; private GoogleMap map; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.layout_with_map, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getChildFragmentManager(); fragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container); if (fragment == null) { fragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map_container, fragment).commit(); } } } 

Следующий код работал для меня. Я использовал карту Google в Fragment :

  SupportMapFragment m = ((SupportMapFragment) getChildFragmentManager() .findFragmentById(R.id.safety_map)); 

Все ответы правильны соответствующим образом. Может случиться так, что вы следуете java-коду someones, который работает на них, но не работает для вас, потому что у вас была другая реализация в вашем xml-коде, чем у них.

Поэтому позвольте мне высказать ваше мнение о том, как мне удалось загрузить карту как в Activity так и в Fragment

Мероприятия:

  <fragment android:name="com.google.android.gms.maps.MapFragment" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"/> 

Класс Java:

 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 

В фрагменте:

 <fragment android:name="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"/> 

Класс Java:

  SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);