每当我 运行 我的片段这行代码 mapFragment.setRetainInstance(true);正在崩溃我的应用程序?
whenever i run my fragment this line of code mapFragment.setRetainInstance(true); is crashing my app?
所以我有一个地图 activity,我将其更改为片段,以便可以在我的 viewpager 上显示它,但是在将 Activity 更改为片段后,这行代码 mapFragment.setRetainInstance (真的);正在崩溃应用程序。将 MapsActivity 更改为 Fragment 时我是否遗漏了什么,我将旧的 MapsActivity class 和我更改为 fragment 的那个放在下面,以便大家看一下。
MapsActivity.java 我将其更改为片段以便可以在 viewpager 上显示它:
public class MapsActivity extends Fragment
implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener,
com.google.android.gms.location.LocationListener {
View view;
Context context;
public static boolean SAVE_LOCATION,SAVE_LOCATION_ADDRESS;
private static final String TAG = "Current Location";
GoogleMap mGoogleMap;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
Location mLastLocation;
private LatLng mDefaultLocation;
private static final int DEFAULT_ZOOM = 15;
private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
private static final int PERMISSION_DATA_ACCESS_CODE = 2;
private boolean mLocationPermissionGranted;
String lat,long_;
SwitchCompat current_loction_switch,selected_location_switch;
ExpandableRelativeLayout expandable_layout;
TextView my_current_location;
TextView new_location_txt;
boolean isMaptouched=false;
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;
// The entry point to the Fused Location Provider.
private FusedLocationProviderClient mFusedLocationProviderClient;
// A default location (Sydney, Australia) and default zoom to use when location permission is
// not granted.
private Location mLastKnownLocation;
private SupportMapFragment mapFragment;
private MapView mapView;
private SharedPreferences sPredMap;
private GoogleMap.OnCameraIdleListener onCameraIdleListener;
ImageView close_country;
TextView current_text_tv;
RelativeLayout current_address_div;
Button save_loc_div;
ImageButton arrow_down;
public MapsActivity() {
// Required empty public constructor
}
@SuppressWarnings("deprecation")
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
context = getContext();
view = inflater.inflate(R.layout.activity_main_maps, container, false);
SharedPreferences sPredMap = this.getActivity().getSharedPreferences(Variables.pref_name,MODE_PRIVATE);
lat = sPredMap.getString(Variables.seleted_Lat,"");
long_ = sPredMap.getString(Variables.selected_Lon,"");
if(lat.isEmpty()&&long_.isEmpty()){
lat = sPredMap.getString(Variables.current_Lat,"");
long_ =sPredMap.getString(Variables.current_Lon,"");
}
mDefaultLocation = new LatLng(Double.parseDouble(lat), Double.parseDouble(long_));
current_text_tv = view.findViewById(R.id.current_text_tv);
close_country = view.findViewById(R.id.close_country);
current_address_div = view.findViewById(R.id.current_address_div);
save_loc_div = view.findViewById(R.id.save_loc_div);
save_loc_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SAVE_LOCATION = true;
SAVE_LOCATION_ADDRESS = true;
Intent data = new Intent();
data.putExtra("lat", String.valueOf(lat));
data.putExtra("lng", String.valueOf(long_));
data.putExtra("location_string",current_text_tv.getText());
getActivity().setResult(Activity.RESULT_OK, data);
//(RESULT_OK, data);
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
String location_string = data.getStringExtra("location_string");
new_location_txt.setText(location_string);
new_location_txt.setText(location_string);
selected_location_switch.setClickable(true);
current_loction_switch.setClickable(true);
selected_location_switch.setChecked(true);
MainMenuActivity.sharedPreferences.edit().putString(Variables.seleted_Lat,latSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_Lon,longSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_location_string,location_string).commit();
}
});
current_address_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), SearchPlaces.class);
startActivityForResult(i, PERMISSION_DATA_ACCESS_CODE);
}
});
close_country.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().finish();
}
});
mGeoDataClient = Places.getGeoDataClient(this.getActivity(), null);
// Construct a PlaceDetectionClient.
mPlaceDetectionClient = Places.getPlaceDetectionClient(this.getActivity(), null);
// Construct a FusedLocationProviderClient.
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this.getActivity());
setupMapIfNeeded();
configureCameraIdle();
mapFragment.setRetainInstance(true);
current_loction_switch = view.findViewById(R.id.current_loction_switch);
selected_location_switch=view.findViewById(R.id.selected_location_switch);
if(MainMenuActivity.sharedPreferences.getBoolean(Variables.is_seleted_location_selected,false)){
selected_location_switch.setChecked(true);
}else {
current_loction_switch.setChecked(true);
}
current_loction_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Variables.is_reload_users=true;
if(isChecked){
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,false).commit();
selected_location_switch.setChecked(false);
}else {
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,true).commit();
selected_location_switch.setChecked(true);
// my_current_location.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}
}
});
selected_location_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Variables.is_reload_users=true;
if(isChecked){
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,true).commit();
current_loction_switch.setChecked(false);
my_current_location.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}else {
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,false).commit();
current_loction_switch.setChecked(true);
}
}
});
new_location_txt=view.findViewById(R.id.new_location_txt);
if(!MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,"").equals("")){
new_location_txt.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}else {
selected_location_switch.setClickable(false);
current_loction_switch.setClickable(false);
}
//below code is to collapse expanble view when arrow is clicked
expandable_layout=view.findViewById(R.id.expandable_layout);
arrow_down =view.findViewById(R.id.arrow_down);
arrow_down.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(expandable_layout.isExpanded()){
arrow_down.setRotation(90);
expandable_layout.collapse();
}
else
arrow_down.setRotation(270);
expandable_layout.expand();
}
});
return view;
}
@Override
public void onResume(){
super.onResume();
setupMapIfNeeded();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
updateLocationUI();
getDeviceLocation();
mGoogleMap.getUiSettings().setCompassEnabled(false);
MapStateManager mgr = new MapStateManager(this.getActivity());
CameraPosition position = mgr.getSavedCameraPosition();
if (position != null) {
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mGoogleMap.moveCamera(update);
mGoogleMap.setMapType(mgr.getSavedMapType());
}
if (mGoogleMap != null) {
mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
if (ActivityCompat.checkSelfPermission(getApplicationContext()
, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext()
, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
}
mGoogleMap.setOnCameraIdleListener(onCameraIdleListener);
}
@Override
public void onStart() {
super.onStart();
}
private void updateLocationUI() {
if (mGoogleMap == null) {
return;
}
try {
if (mLocationPermissionGranted) {
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
} else {
mGoogleMap.setMyLocationEnabled(false);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
mLastKnownLocation = null;
getLocationPermission();
}
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
private void getDeviceLocation() {
try {
if (mLocationPermissionGranted) {
Task locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(this.getActivity(), new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
// Set the map's camera position to the current location of the device.
mLastKnownLocation = (Location) task.getResult();
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(Double.parseDouble(lat), Double.parseDouble(long_)), DEFAULT_ZOOM));
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
SharedPreferences.Editor editor = sPredMap.edit();
editor.putString(Variables.current_Lat, String.valueOf(lat));
editor.putString(Variables.current_Lon, String.valueOf(long_));
editor.apply();
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
}
}
});
}
} catch(SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
private void configureCameraIdle() {
onCameraIdleListener = new GoogleMap.OnCameraIdleListener() {
@Override
public void onCameraIdle() {
LatLng latLng = mGoogleMap.getCameraPosition().target;
Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());
try {
List<Address> addressList = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
if (addressList != null && addressList.size() > 0) {
String country = addressList.get(0).getCountryName();
lat = ""+latLng.latitude;
long_ = ""+latLng.longitude;
current_text_tv.setText(country);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
private void setupMapIfNeeded(){
// Build the map.
if(mGoogleMap==null) {
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
}
}
@Override
public void onPause() {
super.onPause();
MapStateManager mgr = new MapStateManager(this.getActivity());
mgr.saveMapState(mGoogleMap);
}
private void getLocationPermission() {
/*
* Request location permission, so that we can get the location of the
* device. The result of the permission request is handled by a callback,
* onRequestPermissionsResult.
*/
if (ContextCompat.checkSelfPermission(this.getActivity().getApplicationContext(),
android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
} else {
try {
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
catch (Exception e){
e.getMessage();
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PERMISSION_DATA_ACCESS_CODE) {
if(resultCode == RESULT_OK) {
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
lat = latSearch;
long_ = longSearch;
mDefaultLocation = new LatLng(Double.parseDouble(latSearch), Double.parseDouble(longSearch));
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
}
}
if (requestCode == 111) {
if(resultCode == RESULT_OK) {
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
String location_string = data.getStringExtra("location_string");
new_location_txt.setText(location_string);
new_location_txt.setText(location_string);
selected_location_switch.setClickable(true);
current_loction_switch.setClickable(true);
selected_location_switch.setChecked(true);
MainMenuActivity.sharedPreferences.edit().putString(Variables.seleted_Lat,latSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_Lon,longSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_location_string,location_string).commit();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[],
@NonNull int[] grantResults) {
mLocationPermissionGranted = false;
switch (requestCode) {
case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
updateLocationUI();
}
}
}
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this.getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API).build();
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
}
}
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(0);
mLocationRequest.setFastestInterval(0);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
private void getDriversAround(){
DatabaseReference driversLocation = FirebaseDatabase.getInstance().getReference().child(("availableUsers"));
}
}
mapFragment
是 null
。请确认您的 layout
文件包含
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
并且您正在扩充正确的 layout
文件。其次,您的函数 setupMapIfNeeded
条件错误。您的条件应该在片段上,并且必须分配给全局变量 mapFragment
setupMapIfNeeded
private void setupMapIfNeeded(){
// Build the map.
if(mapFragment==null) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
}
}
所以我有一个地图 activity,我将其更改为片段,以便可以在我的 viewpager 上显示它,但是在将 Activity 更改为片段后,这行代码 mapFragment.setRetainInstance (真的);正在崩溃应用程序。将 MapsActivity 更改为 Fragment 时我是否遗漏了什么,我将旧的 MapsActivity class 和我更改为 fragment 的那个放在下面,以便大家看一下。
MapsActivity.java 我将其更改为片段以便可以在 viewpager 上显示它:
public class MapsActivity extends Fragment
implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener,
com.google.android.gms.location.LocationListener {
View view;
Context context;
public static boolean SAVE_LOCATION,SAVE_LOCATION_ADDRESS;
private static final String TAG = "Current Location";
GoogleMap mGoogleMap;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
Location mLastLocation;
private LatLng mDefaultLocation;
private static final int DEFAULT_ZOOM = 15;
private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
private static final int PERMISSION_DATA_ACCESS_CODE = 2;
private boolean mLocationPermissionGranted;
String lat,long_;
SwitchCompat current_loction_switch,selected_location_switch;
ExpandableRelativeLayout expandable_layout;
TextView my_current_location;
TextView new_location_txt;
boolean isMaptouched=false;
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;
// The entry point to the Fused Location Provider.
private FusedLocationProviderClient mFusedLocationProviderClient;
// A default location (Sydney, Australia) and default zoom to use when location permission is
// not granted.
private Location mLastKnownLocation;
private SupportMapFragment mapFragment;
private MapView mapView;
private SharedPreferences sPredMap;
private GoogleMap.OnCameraIdleListener onCameraIdleListener;
ImageView close_country;
TextView current_text_tv;
RelativeLayout current_address_div;
Button save_loc_div;
ImageButton arrow_down;
public MapsActivity() {
// Required empty public constructor
}
@SuppressWarnings("deprecation")
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
context = getContext();
view = inflater.inflate(R.layout.activity_main_maps, container, false);
SharedPreferences sPredMap = this.getActivity().getSharedPreferences(Variables.pref_name,MODE_PRIVATE);
lat = sPredMap.getString(Variables.seleted_Lat,"");
long_ = sPredMap.getString(Variables.selected_Lon,"");
if(lat.isEmpty()&&long_.isEmpty()){
lat = sPredMap.getString(Variables.current_Lat,"");
long_ =sPredMap.getString(Variables.current_Lon,"");
}
mDefaultLocation = new LatLng(Double.parseDouble(lat), Double.parseDouble(long_));
current_text_tv = view.findViewById(R.id.current_text_tv);
close_country = view.findViewById(R.id.close_country);
current_address_div = view.findViewById(R.id.current_address_div);
save_loc_div = view.findViewById(R.id.save_loc_div);
save_loc_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SAVE_LOCATION = true;
SAVE_LOCATION_ADDRESS = true;
Intent data = new Intent();
data.putExtra("lat", String.valueOf(lat));
data.putExtra("lng", String.valueOf(long_));
data.putExtra("location_string",current_text_tv.getText());
getActivity().setResult(Activity.RESULT_OK, data);
//(RESULT_OK, data);
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
String location_string = data.getStringExtra("location_string");
new_location_txt.setText(location_string);
new_location_txt.setText(location_string);
selected_location_switch.setClickable(true);
current_loction_switch.setClickable(true);
selected_location_switch.setChecked(true);
MainMenuActivity.sharedPreferences.edit().putString(Variables.seleted_Lat,latSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_Lon,longSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_location_string,location_string).commit();
}
});
current_address_div.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getActivity(), SearchPlaces.class);
startActivityForResult(i, PERMISSION_DATA_ACCESS_CODE);
}
});
close_country.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().finish();
}
});
mGeoDataClient = Places.getGeoDataClient(this.getActivity(), null);
// Construct a PlaceDetectionClient.
mPlaceDetectionClient = Places.getPlaceDetectionClient(this.getActivity(), null);
// Construct a FusedLocationProviderClient.
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this.getActivity());
setupMapIfNeeded();
configureCameraIdle();
mapFragment.setRetainInstance(true);
current_loction_switch = view.findViewById(R.id.current_loction_switch);
selected_location_switch=view.findViewById(R.id.selected_location_switch);
if(MainMenuActivity.sharedPreferences.getBoolean(Variables.is_seleted_location_selected,false)){
selected_location_switch.setChecked(true);
}else {
current_loction_switch.setChecked(true);
}
current_loction_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Variables.is_reload_users=true;
if(isChecked){
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,false).commit();
selected_location_switch.setChecked(false);
}else {
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,true).commit();
selected_location_switch.setChecked(true);
// my_current_location.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}
}
});
selected_location_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Variables.is_reload_users=true;
if(isChecked){
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,true).commit();
current_loction_switch.setChecked(false);
my_current_location.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}else {
MainMenuActivity.sharedPreferences.edit().putBoolean(Variables.is_seleted_location_selected,false).commit();
current_loction_switch.setChecked(true);
}
}
});
new_location_txt=view.findViewById(R.id.new_location_txt);
if(!MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,"").equals("")){
new_location_txt.setText(MainMenuActivity.sharedPreferences.getString(Variables.selected_location_string,""));
}else {
selected_location_switch.setClickable(false);
current_loction_switch.setClickable(false);
}
//below code is to collapse expanble view when arrow is clicked
expandable_layout=view.findViewById(R.id.expandable_layout);
arrow_down =view.findViewById(R.id.arrow_down);
arrow_down.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(expandable_layout.isExpanded()){
arrow_down.setRotation(90);
expandable_layout.collapse();
}
else
arrow_down.setRotation(270);
expandable_layout.expand();
}
});
return view;
}
@Override
public void onResume(){
super.onResume();
setupMapIfNeeded();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
updateLocationUI();
getDeviceLocation();
mGoogleMap.getUiSettings().setCompassEnabled(false);
MapStateManager mgr = new MapStateManager(this.getActivity());
CameraPosition position = mgr.getSavedCameraPosition();
if (position != null) {
CameraUpdate update = CameraUpdateFactory.newCameraPosition(position);
mGoogleMap.moveCamera(update);
mGoogleMap.setMapType(mgr.getSavedMapType());
}
if (mGoogleMap != null) {
mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
if (ActivityCompat.checkSelfPermission(getApplicationContext()
, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext()
, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
}
mGoogleMap.setOnCameraIdleListener(onCameraIdleListener);
}
@Override
public void onStart() {
super.onStart();
}
private void updateLocationUI() {
if (mGoogleMap == null) {
return;
}
try {
if (mLocationPermissionGranted) {
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
} else {
mGoogleMap.setMyLocationEnabled(false);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
mLastKnownLocation = null;
getLocationPermission();
}
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
private void getDeviceLocation() {
try {
if (mLocationPermissionGranted) {
Task locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(this.getActivity(), new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
// Set the map's camera position to the current location of the device.
mLastKnownLocation = (Location) task.getResult();
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(Double.parseDouble(lat), Double.parseDouble(long_)), DEFAULT_ZOOM));
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
SharedPreferences.Editor editor = sPredMap.edit();
editor.putString(Variables.current_Lat, String.valueOf(lat));
editor.putString(Variables.current_Lon, String.valueOf(long_));
editor.apply();
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
}
}
});
}
} catch(SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
private void configureCameraIdle() {
onCameraIdleListener = new GoogleMap.OnCameraIdleListener() {
@Override
public void onCameraIdle() {
LatLng latLng = mGoogleMap.getCameraPosition().target;
Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());
try {
List<Address> addressList = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
if (addressList != null && addressList.size() > 0) {
String country = addressList.get(0).getCountryName();
lat = ""+latLng.latitude;
long_ = ""+latLng.longitude;
current_text_tv.setText(country);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
private void setupMapIfNeeded(){
// Build the map.
if(mGoogleMap==null) {
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
}
}
@Override
public void onPause() {
super.onPause();
MapStateManager mgr = new MapStateManager(this.getActivity());
mgr.saveMapState(mGoogleMap);
}
private void getLocationPermission() {
/*
* Request location permission, so that we can get the location of the
* device. The result of the permission request is handled by a callback,
* onRequestPermissionsResult.
*/
if (ContextCompat.checkSelfPermission(this.getActivity().getApplicationContext(),
android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
} else {
try {
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
catch (Exception e){
e.getMessage();
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PERMISSION_DATA_ACCESS_CODE) {
if(resultCode == RESULT_OK) {
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
lat = latSearch;
long_ = longSearch;
mDefaultLocation = new LatLng(Double.parseDouble(latSearch), Double.parseDouble(longSearch));
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
}
}
if (requestCode == 111) {
if(resultCode == RESULT_OK) {
String latSearch = data.getStringExtra("lat");
String longSearch = data.getStringExtra("lng");
String location_string = data.getStringExtra("location_string");
new_location_txt.setText(location_string);
new_location_txt.setText(location_string);
selected_location_switch.setClickable(true);
current_loction_switch.setClickable(true);
selected_location_switch.setChecked(true);
MainMenuActivity.sharedPreferences.edit().putString(Variables.seleted_Lat,latSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_Lon,longSearch).commit();
MainMenuActivity.sharedPreferences.edit().putString(Variables.selected_location_string,location_string).commit();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String permissions[],
@NonNull int[] grantResults) {
mLocationPermissionGranted = false;
switch (requestCode) {
case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mLocationPermissionGranted = true;
updateLocationUI();
}
}
}
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this.getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API).build();
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
}
}
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
@Override
public void onConnected(@Nullable Bundle bundle) {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(0);
mLocationRequest.setFastestInterval(0);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
private void getDriversAround(){
DatabaseReference driversLocation = FirebaseDatabase.getInstance().getReference().child(("availableUsers"));
}
}
mapFragment
是 null
。请确认您的 layout
文件包含
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
并且您正在扩充正确的 layout
文件。其次,您的函数 setupMapIfNeeded
条件错误。您的条件应该在片段上,并且必须分配给全局变量 mapFragment
setupMapIfNeeded
private void setupMapIfNeeded(){
// Build the map.
if(mapFragment==null) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
}
}