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