我使用FragmentActivity
和SupportMapFragment
运行了Maps V2
但是现在我正试图让它不使用上面的工作,而是使用
MapView
。地图文档似乎说你可以这样做。
该应用运行,但我只是黑屏,没有地图。
<?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_width="fill_parent"
android:layout_height="fill_parent" >
<com.google.android.gms.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
Java文件:
package com.jps.mapstestthree;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.LayoutInflater;
import android.content.Context;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
public class MainActivity extends Activity
implements OnMapReadyCallback
{
private GoogleMap googleMap;
private View view;
private MapView mapView;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
context = (Context)getApplication();
LayoutInflater inflater =(LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_main, null);
mapView = (MapView)view.findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
initilizeMap();
}
catch (Exception e)
{
}
}
private void initilizeMap()
{
if ( googleMap == null )
{
mapView.getMapAsync(this);
}
}
@Override
protected void onResume()
{
mapView.onResume();
super.onResume();
initilizeMap();
}
@Override
public void onMapReady(GoogleMap map)
{
map.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
}
我使用Fragments时,我的AndroidManifest.xml没有变化 所以我知道钥匙和其他一切正在发挥作用。
我删除了支持v4 .jar,因为如果Fragments我不需要它 哪里没用过。
我尝试过定义其他方法,例如onDestory()
,
因为它似乎希望所有人都进行MapView
转发,
但它抱怨他们,所以我把它们删除了。
我尝试在onMapReady()
中做更多的事情,但事实并非如此
似乎做得很好。
很少有使用MapView
用于V2的示例。
是否可以在不使用Fragment的情况下显示地图 并使用MapView?
如果是这样,我需要做什么才能显示出来?
更新1:
我尝试了几件事,但仍然没有运气。
我添加了所有转发的public final void onDestroy()
等。
这次没有抱怨,而且,在Logcat中,看起来它仍然试图在支持v4 .jar中引用Fragment,所以我甚至添加了支持v4 .jar,
用--subprojects重新做了一个android更新项目,但我还是黑了
屏幕,但确实有它的标题。
是的,这是同一个项目,我刚刚重命名了主项目名称, 包名称相同,Key与工作时相同。
我还删除了带有地图的顶级导入。*并添加了个人 它需要的,它做了一个干净的构建。
更新2:
我终于让它工作了而没有使用支持v4 .jar!
和任何碎片。
我在播放服务示例中找到了示例源RawMapViewDemo.java
,基本上改变了应用程序,使用--subprojects重新运行'android update project',它运行了!!
这是完整的消息来源,希望它可以帮助某人。
package com.jps.mapstestthree;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
public class MainActivity extends Activity
implements OnMapReadyCallback
{
// Google Map
private GoogleMap googleMap;
private View view;
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = (MapView)findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
}
@Override
protected void onResume()
{
super.onResume();
mapView.onResume();
}
@Override
public void onMapReady(GoogleMap map)
{
map.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
@Override
public final void onDestroy()
{
mapView.onDestroy();
super.onDestroy();
}
@Override
public final void onLowMemory()
{
mapView.onLowMemory();
super.onLowMemory();
}
@Override
public final void onPause()
{
mapView.onPause();
super.onPause();
}
}
答案 0 :(得分:10)
你的问题的更新让你对如何解决这个问题充满了神秘感。
所需要的只是跟随父项活动或片段的API docs和转发(至少指定的)生命周期回调到MapView
:
此类的用户必须将包含此视图的
Activity
或Fragment
的所有生命周期方法转发到此类中的相应方法。特别是,您必须转发以下方法:
onCreate(Bundle)
onResume()
onPause()
onDestroy()
onSaveInstanceState()
onLowMemory()
然后,当然,使用API docs中指定的MapView#getMapAsync(OnMapReadyCallback)
来获取对GoogleMap
使用的MapView
的引用。