Android fragments 在片段中映射片段V2

Android fragments 在片段中映射片段V2,android-fragments,google-maps-android-api-2,mapfragment,Android Fragments,Google Maps Android Api 2,Mapfragment,我在Google地图片段中遇到了一些问题“getmap()上的空指针表达式”。我想在片段中插入mapfragment 请检查代码,并告知我是否采取了正确的方法。。 让我知道我需要对代码做什么才能让它工作 我的布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wi

我在Google地图片段中遇到了一些问题“getmap()上的空指针表达式”。我想在片段中插入mapfragment 请检查代码,并告知我是否采取了正确的方法。。 让我知道我需要对代码做什么才能让它工作

我的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 
  android:orientation="vertical"
  android:background="@drawable/bg2"
  android:weightSum="100">

<Button
    android:id="@+id/perx_button"
    android:layout_marginTop="70dip"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/perx_card_btn" />

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

</LinearLayout>


public class PerxDetailedFragment extends SupportMapFragment {

  static final LatLng HAMBURG = new LatLng(53.558, 9.927);
  static final LatLng KIEL = new LatLng(53.551, 9.993);
 GoogleMap map;
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

     FragmentTransaction ft = getFragmentManager().beginTransaction();

    map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap();

    SupportMapFragment fmap = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

    if (fmap == null) {
        fmap = SupportMapFragment.newInstance();
        ft.add(R.id.map, fmap);
    }

    ft.commit();

    Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG)
            .title("Hamburg"));
        Marker kiel = map.addMarker(new MarkerOptions()
            .position(KIEL)
            .title("Kiel")
            .snippet("Kiel is cool")
            .icon(BitmapDescriptorFactory
                .fromResource(R.drawable.ic_launcher)));

        // Move the camera instantly to hamburg with a zoom of 15.
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15));

        // Zoom in, animating the camera.
        map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);


     return inflater.inflate(R.layout.perx_detailed, null, false);
}
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);       


    }


}

公共类PerxDetailedFragment扩展了SupportMapFragment{
静态最终车床汉堡=新车床(53.558,9.927);
静态最终车床基尔=新车床(53.551,9.993);
谷歌地图;
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
FragmentTransaction ft=getFragmentManager().beginTransaction();
map=((SupportMapFragment)getFragmentManager().findFragmentById(R.id.map))
.getMap();
SupportMapFragment fmap=(SupportMapFragment)getFragmentManager().findFragmentById(R.id.map);
如果(fmap==null){
fmap=SupportMapFragment.newInstance();
ft.add(R.id.map,fmap);
}
ft.commit();
Marker hamburg=map.addMarker(新MarkerOptions().position(hamburg)
.名称(“汉堡”);
Marker kiel=map.addMarker(新MarkerOptions()
.职位(基尔)
.标题(“基尔”)
.片段(“基尔很酷”)
.图标(位图描述符工厂)
.fromResource(R.drawable.ic_启动器));
//将相机立即移动到汉堡,变焦为15。
map.moveCamera(CameraUpdateFactory.newLatLngZoom(汉堡,15));
//放大,设置摄影机动画。
animateCamera(CameraUpdateFactory.zoomTo(10),2000年,空);
返回充气机。充气(R.layout.perx_详细,空,假);
}
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
}

删除所有fmap代码:

SupportMapFragment fmap = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

if (fmap == null) {
    fmap = SupportMapFragment.newInstance();
    ft.add(R.id.map, fmap);
}

您已经有一个map实例保存为“map”变量,因此请使用该实例。

您需要首先对布局进行充气。问题是您在onCreateView的末尾执行此操作,因此在调用findFragmentById时映射片段不存在

此外,PerxDetailedFragment应该扩展Fragment,而不是SupportMapFragment

public class PerxDetailedFragment extends Fragment {
    // ...

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.perx_detailed, null, false);

        map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
            .getMap();

        //...

        return v;
    }

您需要扩展SupportMapFragment

public class MapFragment extends SupportMapFragment{

GoogleMap mGoogleMap;
Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mContext=getActivity();
    View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    initializeMap(rootView);
    return rootView;
}
void initializeMap(View rootView)
{
    if (mGoogleMap == null) {
        mGoogleMap=((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map4)).getMap();
        // Getting Map for the SupportMapFragment
        mGoogleMap.setMyLocationEnabled(true);
            if (mGoogleMap == null) {
            Toast.makeText(getActivity().getApplicationContext(),"Sorry! unable to create maps", Toast.LENGTH_SHORT)
                    .show();
        } else {
            setMapDefualtProp();

        }
    }else
        setMapDefualtProp();
}

private void setMapDefualtProp() {
    mGoogleMap.setMyLocationEnabled(true);
    mGoogleMap.setTrafficEnabled(true);
    mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
    mGoogleMap.getUiSettings().setRotateGesturesEnabled(true);
    mGoogleMap.getUiSettings().setCompassEnabled(true);
    mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);
    mGoogleMap.getUiSettings().setZoomControlsEnabled(true);        
} 
}

gMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map)).getMap();