【发布时间】:2017-05-13 16:33:49
【问题描述】:
我正在做一个项目,我在两个地图活动之间切换。
我正在尝试的结构是这样的:
BaseMapsActivity extends FragmentActivity
MapsActivity1 extends BaseMapsActivity
MapsActivity2 extends BaseMapsActivity
为了防止代码重复。我想将我的 Google API 客户端代码放在基础 Activity 中,然后将一些地图样式代码放在基础 onMapReady() 中,然后简单地对每个子 Activity 进行更改(添加标记等)。
我的问题是,如何在基类中准备这个带有样式和位置逻辑的 mapFragment,然后用子活动中的片段膨胀一个框架布局来修改它?这个过程的步骤将如何进行?这甚至可能吗?
public abstract class BaseMapsActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
LocationRequest mLocationRequest;
Location mLastLocation;
Marker mCurrLocationMarker;
public static final String TAG = "BaseMapsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.base_map_activity);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
try {
// Customise the styling of the base map using a JSON object defined
// in a raw resource file.
boolean success = googleMap.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this, R.raw.style_json));
if (!success) {
Log.e(TAG, "Style parsing failed.");
}
} catch (Resources.NotFoundException e) {
Log.e(TAG, "Can't find style. Error: ", e);
}
mMap.moveCamera(CameraUpdateFactory.zoomTo(14));
//Initialize Google Play Services
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
buildGoogleApiClient();
mMap.setMyLocationEnabled(true);
}
} else {
buildGoogleApiClient();
mMap.setMyLocationEnabled(true);
}
}
对于子活动 1...
public class MapsActivity1 extends BaseMapsActivity implements LocationListener, View.OnClickListener {
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
private GoogleMap mMap;
private FirebaseAuth firebaseAuth;
private FirebaseUser user;
private DatabaseReference databaseRef;
private static final String TAG = "MapsActivity1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.onMapReady(mMap);
还有第二个活动……
public class MapsActivity2 extends BaseMapsActivity implements OnMapReadyCallback,
View.OnClickListener, OnProgressListener {
// GoogleMap mMap;
private static GoogleMap mMap;
SeekBar colorSeek;
private double longitude;
private double latitude;
private Bundle mapSpots;
private Button backToMap;
private SeekBar.OnSeekBarChangeListener seekBarListener;
private LatLng user;
private static final String TAG = "MapsActivity2";
private static final int HUE_MAX = 360;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
super.onMapReady(mMap);
谢谢你
【问题讨论】:
-
您的想法和代码对我来说看起来不错,您遇到了什么问题?
-
@jonathanrz 获取空指针异常:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void com.google.android.gms.maps.GoogleMap.setMapType(int)' ----- 它来自 super.onMapReady()
-
@jonathanrz 我想我明白了!我不需要在 onCreate 中调用 super.onMapReady,而是需要在子活动中的 onMapReady 覆盖的顶部调用它。
-
@jonathanrz 感谢您查看 :)
标签: android google-maps android-fragments