如何在Google地图中使用Action Bar(通过ActionBarSherlock)

时间:2013-02-19 18:47:23

标签: android actionbarsherlock google-maps-android-api-2

我正在为Android开发一个GoogleMaps v2 API应用程序并遇到了问题。我想使用ActionBar(通过actionbarsherlock,用于向后兼容),如下图所示。

Maps Example

如果不调整我的代码来使用ActionBar,我的地图应用程序就能很好地工作。我尝试使代码符合使用它会产生一个空白屏幕和一个操作栏。因此,地图本身或其他任何内容都会被加载。

之前的代码:(仅限相关部分)

public class MapActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Initiate loader, so that files can be acquired in background thread.
        new Loader().execute();   
    }
    .
    .
    .
}

我没有包含导入或变量。不要担心,因为代码确实编译。

之后的代码:

public class MapActivity extends SherlockFragmentActivity {


    public boolean onCreate(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0,SEARCH,0,"Search")
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        // Initiate loader, so that files can be acquired in background thread.
        new Loader().execute();
        return true;
    }

    public boolean onOptionsItemSelected (MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case SEARCH:
                openSearchView();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    .
    .
    .
}

编辑 -

映射设置代码:(注意map已声明为类变量)

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

 // Recovers map choice from previous activity.
    Intent intent = getIntent();
    map_descriptor = intent.getStringExtra(MAP);
    MAP_CENTER = map2LatLng(map_descriptor);

    map = setupMap(map);

    // Initiate loader, so that files can be acquired in background thread.
    new Loader().execute();   
}

public GoogleMap setupMap(GoogleMap map) {
    if (map == null) {
        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
        // Just in case null map was accidently passed to setupMap.
    }
    map.setMapType(3); // TERRAIN
    CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(MAP_CENTER)                 
    .zoom(ZOOM_LEVEL)
    .build();

    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    map.setOnCameraChangeListener(new OnCameraChangeListener() {
        public void onCameraChange(CameraPosition cameraPosition) {
                ZOOM_LEVEL = cameraPosition.zoom;
                recenterMap(ZOOM_LEVEL);
        }
    });

    return map;
}

和XML布局代码:

<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.SupportMapFragment"/>

2 个答案:

答案 0 :(得分:1)

如果您要使用带有ActionBarSherlock的Maps V1,则需要the add-on JAR for maps support - 基本上是一个知道ActionBarSherlock的MapActivity

如果要将Maps V2与ActionBarSherlock一起使用,通常会通过片段加载地图,例如this sample app。你的示例代码没有显示你如何在那里获得地图,因此很难猜出为什么没有为你显示地图。

答案 1 :(得分:1)

您没有正确设置SherlockFragmentActivity的内容视图,也没有在设置地图时设置地图。

在onCreate方法中,请确保在调用super.onCreate()后执行此类操作。

setContentView(R.layout.activity_main);
map = setupMap();

即使你从某个地方下载信息(或者你在asynctask中做的任何事情),你仍然需要设置内容视图以在onCreate中正确地膨胀地图。

您还需要确保从onCreate调用setupMap。您可以稍后添加标记。

自从API v2发布之日起,我一直在使用SherlockFragmentActivity和谷歌地图Android API v2,我没有遇到任何问题,因此它必须是您创建视图的顺序。