Android 片段中的地图视图(蜂窝)
既然最终的SDK已经与google API一起发布了,那么使用MapView创建片段的最佳方法是什么?MapView需要MapActivity才能正常工作 让管理片段的活动从MapActivity继承是一个糟糕的解决方案,因为这违背了片段是自包含的并且使用常规的基于xml的布局的想法。我在MapActivity.setupMapView中获得NullPointerException: E/AndroidRuntime( 597): Caused by: java.lang.NullPointerException E/AndroidRuntime( 597): at com.google.android.maps.MapActivity.setupMapView(MapActivity.java:400) E/AndroidRuntime( 597): at com.google.android.maps.MapView.(MapView.java:289) E/AndroidRuntime( 597): at com.google.android.maps.MapView.(MapView.java:264) E/AndroidRuntime( 597): at com.google.android.maps.MapView.(MapView.java:247) 我的第二个想法是以编程方式创建MapView,并通过getActivity将关联的活动作为上下文传递给MapView构造函数。不起作用: E/AndroidRuntime( 834): Caused by: java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity. E/AndroidRuntime( 834): at com.google.android.maps.MapView.(MapView.java:291) E/AndroidRuntime( 834): at com.google.android.maps.MapView.(MapView.java:235) E/AndroidRuntime( 834): at de.foo.FinderMapFragment.onCreateView(FinderMapFragment.java:225) E/AndroidRuntime( 834): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:708) E/AndroidRuntime( 834): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:900) E/AndroidRuntime( 834): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:978) E/AndroidRuntime( 834): at android.app.Activity.onCreateView(Activity.java:4090) E/AndroidRuntime( 834): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664) 真的应该有像MapFragment这样的东西来处理MapView需要的背景线程,我想。。。那么,目前的最佳做法是什么呢 德国的感谢和问候,Android 片段中的地图视图(蜂窝),android,google-maps,android-fragments,android-maps,android-3.0-honeycomb,Android,Google Maps,Android Fragments,Android Maps,Android 3.0 Honeycomb,既然最终的SDK已经与google API一起发布了,那么使用MapView创建片段的最佳方法是什么?MapView需要MapActivity才能正常工作 让管理片段的活动从MapActivity继承是一个糟糕的解决方案,因为这违背了片段是自包含的并且使用常规的基于xml的布局的想法。我在MapActivity.setupMapView中获得NullPointerException: E/AndroidRuntime( 597): Caused by: java.lang.NullPointe
Valentin谷歌地图API不是AOSP的一部分。只要谷歌没有回应,就很难判断未来是否会有地图碎片
一个可能的有限替代方案是使用并滥用它来加载一个自定义的maps.google.com URL。Hm太糟糕了,谷歌还没有响应。FWIW如果你真的需要这样做,我发现除了: 让“管理活动”选项卡继承自MapActivity,在其中以编程方式创建MapView,让mapfragment.xml包含视图组,并使用将MapView添加到视图组 ((ViewGroup) getFragmentManager().findFragmentById(R.id.finder_map_fragment).getView()).addView(mapView);; 显然,这与片段应该是自包含的想法大相径庭,但是…正如在上所讨论的,Peter Doyle也构建了一个支持Google地图的自定义兼容性库 然而,也有一个缺点: 目前,一个缺点是所有扩展FragmentActivity的类都是MapActivitys。可以创建一个单独的类,即FragmentMapActivity,但它需要对FragmentActivity代码进行一些重构
我已经通过在片段中使用TabHost解决了这个问题 这是一个简单的想法: MainFragmentActivity从支持库扩展FragmentActivity,并具有MapFragment
With this new API, adding a map to your Activity is as simple as:
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
MyMapActivity扩展并包含
LocalActivityManagerFragment主机
MapFragment扩展了LocalActivityManagerFragment
其中包含MyMapActivity活动
示例实现:
这解决了我在片段中添加MapView的问题。
在新版本的ABS 4.0中,不支持MapFragmentActivity,这是在片段中使用mapview的一个很好的解决方案
我可以得到解决方案吗 创建类TempFragmentActivity扩展了MapActivity TempFragmentActivity中有一个MapView对象,类似于xml中的普通定义 从parentLinearLayoutvoid以后的异常中删除此MapView对象 将此MapView对象保留在Somewhere Ex:TempFragmentActivity的静态成员中 在片段中,使用codedo not define将这个MapView对象添加到一些LinearLayout中
只是为了澄清答案。我尝试了inazaruk和ChristophK建议的方法。实际上,你可以在一个片段中运行任何活动,而不仅仅是谷歌地图。感谢inazaruk和ChristophK,下面是实现GoogleMap活动的代码片段
import com.actionbarsherlock.app.SherlockFragment;
import android.view.Window;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MapFragment extends SherlockFragment {
private static final String KEY_STATE_BUNDLE = "localActivityManagerState";
private LocalActivityManager mLocalActivityManager;
protected LocalActivityManager getLocalActivityManager() {
return mLocalActivityManager;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle state = null;
if (savedInstanceState != null) {
state = savedInstanceState.getBundle(KEY_STATE_BUNDLE);
}
mLocalActivityManager = new LocalActivityManager(getActivity(), true);
mLocalActivityManager.dispatchCreate(state);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//This is where you specify you activity class
Intent i = new Intent(getActivity(), GMapActivity.class);
Window w = mLocalActivityManager.startActivity("tag", i);
View currentView=w.getDecorView();
currentView.setVisibility(View.VISIBLE);
currentView.setFocusableInTouchMode(true);
((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
return currentView;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle(KEY_STATE_BUNDLE,
mLocalActivityManager.saveInstanceState());
}
@Override
public void onResume() {
super.onResume();
mLocalActivityManager.dispatchResume();
}
@Override
public void onPause() {
super.onPause();
mLocalActivityManager.dispatchPause(getActivity().isFinishing());
}
@Override
public void onStop() {
super.onStop();
mLocalActivityManager.dispatchStop();
}
@Override
public void onDestroy() {
super.onDestroy();
mLocalActivityManager.dispatchDestroy(getActivity().isFinishing());
}
}
我编写了一个小库,将基于LocalActivityManager的解决方案混合到MapFragment问题中,还包括一个示例应用程序,显示了各种使用情况: 这是一个非常简化的MapFragment的Android版MonoDroid Mono:
谷歌在这方面的好消息。他们今天发布了一个室内地图和地图片段
With this new API, adding a map to your Activity is as simple as:
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
截至2012年12月3日,谷歌发布了谷歌地图Android API v2。现在你可以忘记这些问题了。 使用新API的示例- 此API至少适用于Android API 8,所以请使用它 现在您可以简单地使用com.google.android.gms.maps.MapFragment类。它将在您的活动中显示地图。上面链接中的布局示例:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"/>
谢谢,让片段管理活动扩展MapActivity对我来说非常有效。这里希望MapAPI能很快用片段和矢量图更新!如果您希望MapActivity能够与父活动通信,而父活动很容易使用片段,那么您可以使用Activity.getParentYou实际上不需要使用TabHost,您也可以使用LocalActivityManager并将返回的窗口附加到片段的内容,以防其他人怀疑,代码如下:Intent i=newintentgetActivity.getParent,MyMapActivity.class;窗口w=localActivityManager.startActivitytag,i;currentView=w.getDecorView;currentView.setVisibilityView.VISIBLE;currentView.setFocusableInTouchModetrue;ViewGroup currentView.SetDegenantFocusabilityViewGroup.FOCUS在子体之后;this.contentView.addViewcurrentView;请小心,LocalActivityManager现在已被弃用。使用选项卡和片段,它确实适合我。对于那些询问解释的人,我更希望看到项目及其代码,这很容易
理解。是的,LocalActivityManager已被弃用,但这只是一个黑客行为,当他们决定在片段中包含对地图的适当支持时,这个问题应该得到妥善解决。我报告了对此的功能请求。请给它加星星。但是这里讨论的唯一避免LocalActivityManager的解决方案是:扩展所有碎片活动,这似乎更不理想。LocalActivityManager更不受欢迎,因为ActivityGroup不受欢迎,在这种情况下仍然很有用,如果人们使用它来解决他们的缺点,谷歌可能会在未来的版本中三思而后行。这也意味着你的应用程序将无法与最新的支持库同步。虽然android-support-v4-googlemaps已经更新了很多次,但目前落后了两个版本。我同意其他人的看法,即这个修改过的库比使用不推荐的LocalActivityManager更容易受到攻击。截至此消息,现在是最新的r10。我还重构了一些东西,这样以后就很容易跟上时代的发展。我有一个问题。如果应用程序已经部署和安装,没有最新支持库的缺点是什么?IMO,这种方法的主要问题是,您将无法部署具有可选地图支持的应用程序。由于所有的FragmentActivity都扩展了MapActivity,它只会在没有谷歌API的设备上崩溃,例如KindleFire。不完全是这样。试着在碎片页面编辑器中使用它。如果你说的是黑色视图,有一个小补丁可以修复它,谢谢。后来我看到了这一点,但我现在正在使用polaris的第一个MapAPI版本。