我有一个嵌入到另一个片段中的SupportMapFragment
。我从这一行得到NPE(请注意,我找不到原因,目前它似乎是随机发生的):
mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview)).getMap();
(getMap()
是完全返回空值)
但是,当我按照本答案中的说明将其更改为:
mMap = ((SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.mapview)).getMap();
然后我也得到NPE。
我正在使用支持库 v4:19.1.0。
该问题可能与最近从Eclipse(没有Gradle)到Android Studio的项目迁移有关。
活动中使用它
googleMap = ((MapFragment) getFragmentManager().findFragmentById(
R.id.mapNearMEButton)).getMap();
并在片段中提供给用户支持地图片段。
确保您处于动态膨胀其Fragment
Activity
。
注: 当布局出现时,您无法将布局膨胀为片段 包括一个 .嵌套片段仅在添加时受支持 动态到片段。
例如:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment);
if(fragment == null){
MainActivityFragment mMainActivityFragment = new MainActivityFragment();
fm.beginTransaction()
.replace(R.id.fragment, mMainActivityFragment, "MainActivityFragment")
.commit();
}
}
}
R.layout.activity_main
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
主活动片段
public class MainActivityFragment extends Fragment {
private SupportMapFragment supportMapFragment;
private GoogleMap mGoogleMap = null;
public MainActivityFragment() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
supportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.container_map);
if (supportMapFragment == null) {
supportMapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.container_map, supportMapFragment).commit();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mRoot = inflater.inflate(R.layout.fragment_main, container, false);
return mRoot;
}
@Override
public void onResume() {
createMapView();
super.onResume();
}
private void createMapView() {
mGoogleMap = supportMapFragment.getMap();
if (mGoogleMap != null) {
mGoogleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
return false;
}
});
}
}
}
R.layout.fragment_main
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>