在 drawerlayout 片段中添加 google maps api v2

Add google maps api v2 in a drawerlayout fragment

我一直在尝试使用 Android Studio 在带有片段的抽屉式布局中插入地图。我已经实现了显示地图,但我无法为其添加标记。我想知道我做错了什么。还有其他方法可以将地图添加到抽屉布局吗?

这是我的 MainActivity:

package com.example.alex.testing_map;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;


public class MapsActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
   ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(
            this, drawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer);

    drawerLayout.setDrawerListener(drawerToggle);
    drawerToggle.syncState();

    Fragment fragment = new MapFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.frame_content, fragment);
    ft.commit();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
        drawerLayout.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item){

    switch (item.getItemId()){
        case R.id.add_item:
            Intent intent = new Intent(this, AddMail.class);
            this.startActivity(intent);
            break;
        default:
            return super.onOptionsItemSelected(item);
    }

    return true;

}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    Fragment fragment = null;

    switch (item.getItemId()){
        case R.id.mapa:
            fragment = new MapFragment();
            FragmentTransaction ft1 = getSupportFragmentManager().beginTransaction();
            ft1.replace(R.id.frame_content, fragment);
            ft1.commit();
            break;
        case R.id.help:
            fragment = new Help();
            FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();
            ft2.replace(R.id.frame_content, fragment);
            ft2.commit();
            break;
        case R.id.about:
            break;
        default:
            return true;

    }

    DrawerLayout drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    drawerLayout.closeDrawer(GravityCompat.START);
    return true;
}


}

我的 MapFragment:

package com.example.alex.testing_map;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MapFragment extends Fragment implements OnMapReadyCallback{


private GoogleMap mMap;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.map_fragment, viewGroup, false);
    return view;


}



@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;


    mMap.getUiSettings().setCompassEnabled(false);
    mMap.getUiSettings().setIndoorLevelPickerEnabled(false);
    mMap.getUiSettings().setMapToolbarEnabled(false);
    mMap.getUiSettings().setRotateGesturesEnabled(false);
    mMap.getUiSettings().setZoomControlsEnabled(false);


    LatLng p1 = new LatLng(41.39355, 2.15473);
    mMap.addMarker(new MarkerOptions().position(p1));
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(p1, 18));


}

}

有了这个一切运行良好,但不显示标记。我试图将此(以及我发现的所有变体)添加到 MapFragment class,但它显示 "cannot resolve method 'getSupportFragmentManager' ":

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

我的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout  
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="513dp"
tools:context="com.example.alex.testing_map.MapsActivity"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>

</RelativeLayout>

我找到了解决办法!!我已经按照老板在这里给出的答案:

我只改变了一点点。我没有在事务中添加片段,而是替换了它(在 MapFragment.java 中),然后在 MainActivity 的 onCreate 中我添加了片段而不是替换它。

在 MainActivity 中(在 onCreate 内部):

    Fragment fragment = new MapFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.frame_content, fragment);
    ft.commit();