Как использовать ActionBar (через ActionBarSherlock) с GoogleMaps

Я разрабатываю приложение API GoogleMaps v2 для Android и столкнулся с проблемой. Я хотел бы использовать ActionBar (через actionbarsherlock для обратной совместимости), как показано на следующем рисунке.

Пример Карт
(источник: google.com)

Без адаптации моего кода для 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"/>

person jhc    schedule 19.02.2013    source источник
comment
Я хотел бы использовать ActionBar (через actionbarsherlock для обратной совместимости), находясь в полноэкранном режиме — наличие панели действий и полноэкранный режим являются взаимоисключающими понятиями. как на следующем рисунке — ни один из этих рисунков не показывает полноэкранный режим по любому стандартному определению Android для полноэкранного режима.   -  person CommonsWare    schedule 19.02.2013
comment
Имеет смысл. Я имел в виду без TitleBar. Сообщение отредактировано, спасибо.   -  person jhc    schedule 19.02.2013
comment
Я имел в виду отсутствие TitleBar — панель действий является строкой заголовка. Вы не можете одновременно иметь панель действий и не иметь панели действий.   -  person CommonsWare    schedule 19.02.2013
comment
Ну это наименьшая из моих проблем на самом деле. Сообщение отредактировано.   -  person jhc    schedule 19.02.2013


Ответы (2)


Вы неправильно настраиваете представление содержимого для SherlockFragmentActivity и не настраиваете карту, когда она должна быть настроена.

В вашем методе onCreate убедитесь, что вы делаете что-то подобное после вызова super.onCreate().

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

Даже если вы откуда-то загружаете информацию (или что-то еще делаете в этой асинхронной задаче), вам все равно нужно настроить представление содержимого для правильного расширения карты в onCreate.

Вам также нужно убедиться, что вы вызываете setupMap из onCreate. Вы можете добавить маркеры позже.

Я использую SherlockFragmentActivity с Google Maps Android API v2 со дня выпуска API v2, и у меня не было проблем, поэтому это должен быть порядок, в котором вы создаете свое представление.

person DiscDev    schedule 19.02.2013
comment
Привет, spotdog13, все мои строки onCreate находятся внутри класса Loader, так как я хочу убедиться, что смогу загрузить все данные, прежде чем открывать фрагмент карты. Опять же, это работает, когда не используется Шерлок. Проверьте: github.com/JVUnderground/MapaSara/ blob/master/src/com/aquamet/ (строки 387–414), если это возможно. - person jhc; 20.02.2013
comment
Подбодри меня и попробуй поместить setContentView и setupMap в файл onCreate. Я предполагаю, что ABS пытается подключиться к любому представлению, загруженному в onCreate, и, поскольку карта еще не загружена, она занимает весь экран, и карта не отображается. С другой стороны, я действительно не думаю, что это правильный процесс, чтобы убедиться, что вы можете загрузить все данные карты, прежде чем показывать карту. Я думаю, что было бы лучше сразу показать карту, затем загрузить данные в фоновом режиме с помощью ProgressDialog, который говорит «Загрузка...» или что-то подобное, пока это не будет сделано, и выйти из карты, если загрузка не удалась. - person DiscDev; 20.02.2013
comment
Как я уже сказал, я использую ABS + Maps v2 с того дня, как он был выпущен с 0 проблемами, и единственная разница между нашими реализациями заключается в том, что вы не вызываете setContentView или setupMap в onCreate. - person DiscDev; 20.02.2013

Если вы собираетесь использовать Maps V1 с ActionBarSherlock, вам понадобится JAR-файл надстройки для поддержки карт. -- в основном MapActivity, который знает об ActionBarSherlock.

Если вы собираетесь использовать Maps V2 с ActionBarSherlock, вы обычно загружаете карту через фрагмент, например, в этот образец приложения. Нигде в вашем примере кода не показано, как вы получаете карту, и поэтому трудно догадаться, почему карта не отображается для вас.

person CommonsWare    schedule 19.02.2013
comment
К сожалению, у меня есть только ключ v2, поэтому я не могу использовать MapActivity. - person jhc; 19.02.2013
comment
@jhc: обновлено для Карт V2. Возможно, вы захотите опубликовать код, в котором вы добавляете карту в свой пользовательский интерфейс. Если ваша проблема в том, что этот код не работает, нам нужно увидеть этот код. - person CommonsWare; 19.02.2013
comment
Я отредактировал сообщение. Не уверен, что это абсолютно необходимо, поскольку карта загружалась нормально до реализации панели действий. - person jhc; 19.02.2013
comment
@jhc: взгляните на пример приложения, на которое я ссылался в своем ответе, и определите, где вы делаете что-то по-другому. - person CommonsWare; 19.02.2013
comment
Я взглянул на пример кода, вы используете собственный класс AbstractMapActivity, но я почти уверен, что делаю то же самое, расширяя SherlockFragmentActivity. Ознакомьтесь с отредактированным сообщением и ссылкой: github.com/JVUnderground/MapaSara - person jhc; 20.02.2013