在drawerlayout片段中添加google maps api v2

时间:2016-03-08 17:36:03

标签: android google-maps android-fragments google-maps-api-2 supportmapfragment

我一直在尝试使用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类中,但它说“无法解析方法'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>

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!!我已按照Boss给出的答案:Trying to put a map in a fragment activity

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

在MainActivity中(在onCreate中):

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