【问题标题】:Google Maps API v2 Custom MapFragment + SimpleFragmentGoogle Maps API v2 自定义 MapFragment + SimpleFragment
【发布时间】:2013-01-05 16:10:38
【问题描述】:

我需要创建一个简单的应用程序,其中包含 1.自定义MapFragment,可以显示当前位置(LocationListener?),两个标记等。 2. 简单的空片段。

应用不得使用 support v4 (sdk 11+) / FragmentActivity。

空片段。

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black" >
</RelativeLayout>

类:

public class FirstFragment extends Fragment{

public FirstFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.first_fragment, container, false);
    return view;
}
}

地图片段(尝试使其成为单例)。

XML:

<?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"/>

public class ThirdMapFragment extends MapFragment {
public static MapFragment instance;

@Override
public View onCreateView(LayoutInflater arg0, ViewGroup arg1, Bundle arg2) {
    View view;
    view = arg0.inflate(R.layout.map_fragment, arg1, false);
    return view;
}

public static MapFragment getInstance() {
    if (instance == null) {
        instance = newInstance();
    }
    // NullPointerException in getMap() ???
    // instance.getMap().addMarker(new MarkerOptions().position(new LatLng(41.1, 39)));
    return instance;
}

@Override
public void onCreate(Bundle arg0) {
    super.onCreate(arg0);
}
}

主要活动:

public class ActivityMain extends Activity implements OnClickListener {
FragmentManager fragmentManager;
FragmentTransaction transaction;
FirstFragment firstFragment;
MapFragment mapFragment;

// Buttons
Button b4;

int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    fragmentManager = getFragmentManager();
    transaction = fragmentManager.beginTransaction();

    b4 = (Button) findViewById(R.id.button4);

    b1.setOnClickListener(this);

    firstFragment = new FirstFragment();
    mapFragment =  ThirdMapFragment.getInstance();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onClick(View v) {
    makeTransaction(v.getId());
}



private void makeTransaction(int id) {
    i++;
    transaction = fragmentManager.beginTransaction();
    if (i == 1) {
        transaction.replace(R.id.relativeLayout, firstFragment).commit();
    } else if (i == 2) {
        transaction.replace(R.id.relativeLayout, secondFragment).commit();
    } else {
    transaction.replace(R.id.relativeLayout, mapFragment).commit();
        i = 0;
    }
}
}

R.id.relativeLayout - main.xml 中的布局

但我没有看到地图(带有缩放按钮的空白屏幕)以及如何制作 LocationListener?谢谢。

【问题讨论】:

    标签: android android-fragments google-maps-api-2 currentlocation mapfragment


    【解决方案1】:

    如果您使用支持库,则必须使用 SupportMapFragment 类,而不是 MapFragment 用于地图片段。您的活动应该是一个 FragmentActivity 以支持库。以及片段管理器。你必须getSupportFragmentManager()。

    看看这段代码:

    import com.google.android.gms.common.GooglePlayServicesUtil;
    import android.os.Bundle;
    import com.google.android.gms.maps.*;
    
    public class Map extends android.support.v4.app.FragmentActivity
    {
    private GoogleMap map;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.map);
    
            if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()) == 0)
            {
                map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
                map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            }
    }}
    

    如果您在进行这些更改后仍然看不到地图。检查您的 API 控制台,您已打开 Google Map ANDROID API V2,而不仅仅是可能导致与您描述的结果相同的 Google Map API V2。

    【讨论】:

    • 不应该异步设置地图加上getMapAsync(this)并实现onMapReady?
    • 我从未使用过此选项,而且我使用 Maps API 已经有一段时间了。
    【解决方案2】:

    视图尚未创建,这就是为什么 getMap() 返回 null,地图不存在,将代码放入 onResume

    【讨论】:

      【解决方案3】:

      放入manifest,android的key? 例如:

      <application
              android:icon="@drawable/android"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >
              <meta-data android:name="com.google.android.maps.v2.API_KEY"
                  android:value="AIzaSyB2s6isdfsghDfgdfdfgDFGDG-yi4-aAYUma0Owc"/>
      

      https://developers.google.com/maps/documentation/android/start

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多