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 。 你应该改用你的Fragment的FragmentManager : 
例如,这个:
 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代码中的实现与他们不同。
 所以,让我给你看看我是如何在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);