无法通过LatLng移动地图

时间:2017-10-12 21:29:19

标签: android

public class MainActivity extends AppCompatActivity {
    static ArrayList<String>places;
    static ArrayList<String>lat;
    static ArrayList<String>lng;


    static ArrayAdapter arrayAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView)findViewById(R.id.listView);
        lat = new ArrayList<String>();
        lng = new ArrayList<String>();


        SharedPreferences sharedPreference = this.getSharedPreferences("com.example.inbal.memorableplaces", Context.MODE_PRIVATE);
        try {
            places =(ArrayList<String>) ObjectSerializer.deserialize(sharedPreference.getString("Places",ObjectSerializer.serialize(new ArrayList<String>())));
            lat =(ArrayList<String>) ObjectSerializer.deserialize(sharedPreference.getString("Lat",ObjectSerializer.serialize(new ArrayList<String>())));
            lng =(ArrayList<String>) ObjectSerializer.deserialize(sharedPreference.getString("Lng",ObjectSerializer.serialize(new ArrayList<String>())));

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (lat.size()==0)
            lat.add("");
        if (lng.size()==0)
            lng.add("");


        if (places.size()==0)
            places.add("Add a new place");
        arrayAdapter= new ArrayAdapter(this,android.R.layout.simple_list_item_1,places);

        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Intent intent = new Intent(getApplicationContext(), MapsActivity.class);
                    intent.putExtra("placeName", i);
                    startActivity(intent);
            }
        });
    }
}


    public class MapsActivity extends FragmentActivity implements 
    OnMapReadyCallback,GoogleMap.OnMapLongClickListener{

    private GoogleMap mMap;
    LocationManager locationManager;
    LocationListener locationListener;

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED)
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1,10,locationListener);


        }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready Gto be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        Intent intent = getIntent();
        int num = intent.getIntExtra("placeName", 0);
        if (num == 0) {
            mMap = googleMap;
            mMap.setOnMapLongClickListener(this);
            locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
            locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude());
                    mMap.clear();
                    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15));
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {
                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s) {

                }
            };


            if (Build.VERSION.SDK_INT < 23)
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 10, locationListener);
            else {
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20, 10, locationListener);
                else
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

            }


        }
        else {
           String lat = MainActivity.lat.get(num);
            String lng = MainActivity.lng.get(num);
            LatLng location= new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(location));
        }

    }

    @Override
    public void onMapLongClick(LatLng latLng)
    {
        Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
        try {
            List<Address> listAddress = geocoder.getFromLocation(latLng.latitude,latLng.longitude,1);
            String address = "";

            if (listAddress!=null && listAddress.size()>0) {
                if (listAddress.get(0).getLocality() != null) {
                    address+=listAddress.get(0).getLocality();
                    if (listAddress.get(0).getThoroughfare() != null)
                        address=address+", "+listAddress.get(0).getThoroughfare();
                        if (listAddress.get(0).getSubThoroughfare() != null)
                            address=address +" "+listAddress.get(0).getSubThoroughfare();
                }
                mMap.clear();
                mMap.addMarker(new MarkerOptions().position(latLng).title(address));
            }
                MainActivity.places.add(address);
                MainActivity.lat.add(Double.toString(latLng.latitude));
                MainActivity.lng.add(Double.toString(latLng.longitude));
                SharedPreferences sharedPreferences = this.getSharedPreferences("com.example.inbal.memorableplaces",Context.MODE_PRIVATE);
            sharedPreferences.edit().putString("Places",ObjectSerializer.serialize(MainActivity.places)).apply();
            sharedPreferences.edit().putString("Lat",ObjectSerializer.serialize(MainActivity.lat)).apply();
            sharedPreferences.edit().putString("Lng",ObjectSerializer.serialize(MainActivity.lng)).apply();
            MainActivity.arrayAdapter.notifyDataSetChanged();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

嘿,我建立了一个应该保存位置的项目。唯一的问题是,在我按下位置​​并保存后,我再也无法显示位置了。 行mMap.moveCamera(CameraUpdateFactory.newLatLng(location));会使应用崩溃,因为它说

  

java.lang.NullPointerException:尝试调用虚方法&#39; void   com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)&#39;   在空对象引用上

1 个答案:

答案 0 :(得分:1)

这是因为只有在满足条件mMap时才设置变量num == 0

将您的代码更改为:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    Intent intent = getIntent();
    int num = intent.getIntExtra("placeName", 0);
    if (num == 0) {
        //....
    } else {
        //....
    }
}