以编程方式将 GoogleMap 添加到片段
Posted
技术标签:
【中文标题】以编程方式将 GoogleMap 添加到片段【英文标题】:Adding A GoogleMap to a Fragment Programmatically 【发布时间】:2016-06-18 11:50:15 【问题描述】:这几天我一直在尽力解决这个问题,除了大量的 Google 搜索之外,我还阅读了其他 *** 帖子的建议。我认为主要问题是“getMap()”方法已被弃用,为“getMapAsync()”让路,而使用后者的解释不符合我的使用方式。因此,考虑到这一点,我认为此时一个问题也可能与其他问题相关。
基本上,到目前为止,我已经用按钮创建了一个菜单,允许用户在片段之间切换。这些片段之一需要是一个谷歌地图,它将在按下按钮时启动,保持按钮在视图中。
我的 MapsActivity 代码来自:-http://www.joellipman.com/articles/google/android/application-development/android-os-add-googlemap-as-fragment.html - 但如前所述,不推荐使用 getMap()。我也看了 -How to put Google Maps V2 on a Fragment Using ViewPager - 但问题是一样的。
MainActivity...
public class MainActivity extends AppCompatActivity
Button mapMenuItem, postcodeMenuItem, nameMenuItem, recentMenuItem;
ConnectivityManager conMgr;
NetworkInfo networkInfo;
FrameLayout fragmentContainer;
NameFragment nf;
String longiString, latiString;
public static FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapMenuItem = (Button) findViewById(R.id.mapButton);
postcodeMenuItem = (Button) findViewById(R.id.postcodeButton);
nameMenuItem = (Button) findViewById(R.id.nameButton);
recentMenuItem = (Button) findViewById(R.id.recentButton);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentManager = getFragmentManager();
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
public void searchMap(View v)
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
MapFragment mf = new MapFragment();
ft.replace(R.id.fragmentContainer, mf);
ft.commit();
mapMenuItem.setBackgroundColor(Color.parseColor("#fece35"));
nameMenuItem.setBackgroundColor(Color.parseColor("#eff169"));
postcodeMenuItem.setBackgroundColor(Color.parseColor("#eff169"));
recentMenuItem.setBackgroundColor(Color.parseColor("#eff169"));
MapFragment...
public class MapFragment extends Fragment
MapView mapView;
GoogleMap gMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View v = inflater.inflate(R.layout.map_fragment, container, false);
mapView = (MapView) v.findViewById((R.id.mapView));
mapView.onCreate(savedInstanceState);
mapView.onResume();
try
MapsInitializer.initialize(getActivity().getApplicationContext());
catch (Exception e)
e.printStackTrace();
gMap = mapView.getMap();
double latitude = 17.385044;
double longitude = 78.486671;
//create marker
MarkerOptions marker = new MarkerOptions().position(
new LatLng(latitude, longitude)).title("Hello Maps");
//changing marker icon
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
//adding marker
gMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder().target(
new LatLng(17.385044, 78.486671)).zoom(12).build();
gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
//Perform any camera updates
return v;
@Override
public void onResume()
super.onResume();
mapView.onResume();
@Override
public void onPause()
super.onPause();
mapView.onPause();
@Override
public void onDestroy()
super.onDestroy();
mapView.onDestroy();
@Override
public void onLowMemory()
super.onLowMemory();
mapView.onLowMemory();
MapLayout...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_
android:layout_
android:apiKey="@string/google_maps_key"
android:clickable="false"/>
AcivityLayout...
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:background="#72a972"
android:orientation="vertical"
android:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp"
tools:context="uk.ac.mmu.webmd.foodhygieneapp.MainActivity">
<RelativeLayout
android:id="@+id/rel_layout"
android:layout_
android:layout_
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:background="#eff169"
android:gravity="center_horizontal">
<Button
android:id="@+id/mapButton"
android:layout_
android:layout_
android:background="#eff169"
android:onClick="searchMap"
android:text="@string/MapsButton" />
<Button
android:id="@+id/nameButton"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/mapButton"
android:background="#eff169"
android:onClick="nameMenu"
android:text="@string/NameButton" />
<Button
android:id="@+id/postcodeButton"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/recentButton"
android:background="#eff169"
android:onClick="postcodeMenu"
android:text="@string/PostcodeButton" />
<Button
android:id="@+id/recentButton"
android:layout_
android:layout_
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:background="#eff169"
android:onClick="recentMenu"
android:text="@string/RecentButton" />
</RelativeLayout>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_
android:layout_>
</FrameLayout>
</LinearLayout>
【问题讨论】:
你的问题是什么? 【参考方案1】:这是我在不使用任何布局 XML 的情况下创建地图的代码。它来自许多帖子,每个帖子都贡献了图片的重要组成部分,因此感谢所有这些作者。它被设计为在支持类中运行,因此必须传入 Activity。结果是一个独立的 FrameLayout,其中包含一个地图,因此它可以添加到您的应用程序中可能已经拥有的任何布局中,允许您让地图只占据屏幕的一部分。
package pro.scanna.easycoder.android.handler;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import pro.scanna.R;
public class ProgrammaticMap
public void create(final AppCompatActivity activity, final ViewGroup parent)
FrameLayout frame = new FrameLayout(activity);
frame.setId(R.id.reservedNamedId);
frame.setLayoutParams(new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT));
parent.addView(frame);
FragmentTransaction transaction =
activity.getSupportFragmentManager().beginTransaction();
SupportMapFragment fragment = new SupportMapFragment();
transaction.add(frame.getId(), fragment);
transaction.commit();
try
MapsInitializer.initialize(activity);
catch (Exception e)
e.printStackTrace();
fragment.getMapAsync(new OnMapReadyCallback()
@Override
public void onMapReady(GoogleMap map)
setupMap(map);
);
private void setupMap(final GoogleMap map)
double latitude = 0; // set this
double longitude = 0; // set this too
float zoom = 17f; // or whatever, between 2 and 21 (approx)
map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
map.animateCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(latitude, longitude), zoom), 1000,
new GoogleMap.CancelableCallback()
@Override
public void onFinish()
doneSetup();
@Override
public void onCancel()
doneSetup();
);
map.setOnMapClickListener(new GoogleMap.OnMapClickListener()
@Override
public void onMapClick(LatLng location)
// Here when the map is tapped
);
private void doneSetup()
// Do whatever comes next
框架的 id 需要一个资源。为此,请创建一个名为 res/values/ids.xml
的资源文件,其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
【讨论】:
【参考方案2】:创建一个 FrameLayout 作为容器以在任何布局中保存地图片段 -
<FrameLayout
android:id="@+id/map"
android:layout_
android:layout_ />
然后以编程方式添加它 -
MapFragment mapFragment = MapFragment.newInstance();
mapFragment.getMapAsync(this);
getFragmentManager()
.beginTransaction()
.add(R.id.map, mapFragment)
.commit();
如果在 Fragment 本身中添加地图片段,请使用 getChildFragmentManager()
。
如果您使用的是SupportMapFragment
实例,请使用getSupportFragmentManager()
。
【讨论】:
【参考方案3】:以编程方式加载地图,
FragmentManager fm = getSupportFragmentManager(); SupportMapFragment supportMapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.mapContainer, supportMapFragment).commit();
在xml中:
<FrameLayout android:id="@+id/mapContainer" android:layout_ android:layout_/>
【讨论】:
【参考方案4】:How to put Google Maps V2 on a Fragment Using ViewPager
原来答案一直都在这里,抱歉浪费了大家的时间!
【讨论】:
以上是关于以编程方式将 GoogleMap 添加到片段的主要内容,如果未能解决你的问题,请参考以下文章
Android:以编程方式在片段中添加多个 RecyclerView