GoogleMap Fragment返回null对象

时间:2017-05-12 16:43:20

标签: java android google-maps android-fragments google-play-services

我希望有一个来自MainActivity的独立类来初始化map并且有静态方法进行初始化,所以它在整个项目中保持相同,任何类都可以使用这个从类返回的googlemap对象,我写了一个单独的类

public class MapFragment extends AppCompatActivity{

public static SupportMapFragment mapFrag;

public static SupportMapFragment GetMapObj() {
   mapFrag = (SupportMapFragment) new MainActivity().
   getSupportFragmentManager().findFragmentById(R.id.frag_map);
}

在MainActivity中使用它就像这样

SupportMapFragment mapFragment = MapFragment.GetMapObj();
        mapFragment.getMapAsync(this);

我上面的课有2 xml 1,mainActivity有1 xn我知道我应该把我的

放在哪里
 <fragment
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/frag_map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    tools:context="com.example.sarahn.clientapimap.MainActivity"
    />

说过所有这些我的应用程序崩溃在空指针异常上试图在空对象引用上调用getAsncMap

}

4 个答案:

答案 0 :(得分:1)

由于NullPointerException未正确初始化,您收到mapFragment

初始化SupportMapFragment中的MainActivity

main_activity_xml中的

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

现在在MainActivity

 public class MainActivity extends FragmentActivity implements OnMapReadyCallback{


  SupportMapFragment smp;
  GoogleMap mMap;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity_xml);
        smp = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        smp.getMapAsync(this);
        }

    @Override
    public void onMapReady(GoogleMap map) {
        mMap = map;
        //map initialized
    }
}

答案 1 :(得分:1)

如果您希望自己的活动在用户在地图中执行某些操作时执行此操作,请尝试此操作。

public class YourFragment extends Fragment implements OnMapReadyCallback,
    GoogleMap.OnMapClickListener,
    GoogleMap.OnMarkerClickListener{

    private MapFragment mapFragment;
    private GoogleMap mMap;
    private OnMapListener onMapListener;

    public static YourFragment newInstance(){
        return new YourFragment();
    }

    @Override public void onAttach(Context context) {
        super.onAttach(context);
        try {
            this.onMapListener = (OnMapListener)context;
        }
        catch (final ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnMapListener");
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout, container, false);

        mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id. frag_map); 
        mapFragment.getMapAsync(this); //Its async, It could last a little bit and 
        //that is the reason why you are getting NULL,
        // to work Asynchronously you should implement the Callback 'OnMapReadyCallback'.

        return rootView;
    }

    @Override public void onMapReady(GoogleMap googleMap) { 
        mMap = googleMap; 
        mMap.setOnMapClickListener(this);
        mMap.setOnMarkerClickListener(this);
    }

    @Override public void onMapClick(LatLng latLng) {
        onMapListener.onMapClick(latLng);
    }

    @Override public boolean onMarkerClick(Marker marker) {
        onMapListener.onMarkerClick(marker);
    }

    public interface OnMapListener{
        void onMapClick(LatLng latLng);
        void onMarkerClick(Marker marker);
    }
}


public class YourActivity extends AppCompatActivity implements OnMapListener {

    @Override protected void onCreate(Bundle savedInstanceState) {

        ...
        YourFragment newFragment = YourFragment.newInstance();
        ...
    }

    public void onMapClick(LatLng latLng){
    //do something on your activity
    }
    public void onMarkerClick(Marker marker){
    //do something on your activity
    }          
}

答案 2 :(得分:1)

您可以扩展SupportMapFragment并在片段自己的onCreate方法中初始化地图。这样可以避免使用逻辑上属于片段的代码来混乱您的活动。

public class MyMapFragment extends SupportMapFragment {
    @Override
    public void onCreate(final Bundle bundle) {
        super.onCreate(bundle);
        getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(final GoogleMap map) {
                // configure the map here
            }
        });
    }
}

然后将其放入您的活动XML中,就像普通的SupportMapFragment一样。

<fragment
    android:id="@+id/map"
    android:name="com.myapp.MyMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

如果您仍需要访问活动中的片段,请拨打getSupportFragmentManager().findFragmentById(R.id.map)。但由于片段配置了地图,因此活动可能不再需要访问它。使用片段的活动通常只需onCreate调用setContentView

答案 3 :(得分:0)

问题在于您正在尝试创建新的上下文而不是让操作系统执行此操作。您必须在现有上下文中使用startActivity来创建新活动。

至于你想如何获得你的地图对象,这是一个例子:

public class MapFragment extends AppCompatActivity{

    public static SupportMapFragment mapFrag;

    public static SupportMapFragment GetMapObj(FragmentActivity activity) {
       mapFrag = (SupportMapFragment) activity.
         getSupportFragmentManager().findFragmentById(R.id.frag_map);
    }
}

在您的活动中,请致电:

SupportMapFragment mapFragment = MapFragment.GetMapObj(this);
        mapFragment.getMapAsync(this);