Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段中的地图视图(蜂窝)_Android_Google Maps_Android Fragments_Android Maps_Android 3.0 Honeycomb - Fatal编程技术网

Android 片段中的地图视图(蜂窝)

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

既然最终的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需要的背景线程,我想。。。那么,目前的最佳做法是什么呢

德国的感谢和问候,
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版本。