【问题标题】:Android GoogleMaps - Inheriting a map fragment from a base fragment activity abstract classAndroid GoogleMaps - 从基本片段活动抽象类继承地图片段
【发布时间】: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


【解决方案1】:

需要在子类的onMapReady覆盖中调用super.onMapReady(Bundle savedInstanceState)而不是:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    super.onMapReady(mMap);

应该是这样的:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    super.onMapReady(mMap);

@Override
protected void onMapReady(GoogleMap googleMap){
    mMap = googleMap;
    super.onMapReady(mMap);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多