supportMapFragment的findFragmentById在Android Studio中返回null

最近我将一个项目从Eclipse移植到了Android Studio。 一切都设置和工作正常,除了我的一个使用SupportMapFragment片段。 下面的findFragmentById(在Eclipse中构build时工作)现在返回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') } 

我没有改变以前在Eclipse中工作的xml文件或Fragment类中的任何代码。

根据您重写Fragment.onActivityCreated()的事实判断,包含地图片段的布局是您的Fragment的布局。 在这种情况下, SupportMapFragment是您的主机Fragment片段。 当您尝试检索它时,您正在使用Activity FragmentManager 。 你应该改用你的FragmentFragmentManager

例如,这个:

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

变为:

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

是。 如果你的Map片段是片段的内部部分(由于一些问题,提到这个和这个 ), 这对targetSdkVersion 21来说是不起作用的。

作为临时解决可以build议这样的把戏:

 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(); } } } 

下面的代码为我工作。 我在Fragment使用Google Map:

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

所有的答案都是正确的。 可能发生的情况是,您遵循某些正在为其工作的java代码,但不适合您,因为您在xml代码中的实现与他们不同。

所以,让我给你看看我是如何在ActivityFragment加载地图的

活动:

  <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);