Google Maps Tutorial: Что такое контекст? - PullRequest
2 голосов
/ 31 декабря 2011

Сейчас я пытаюсь создать приложение для Android, в котором критической особенностью является возможность щелкнуть мышью по области и установить там флаг.
Чтобы научиться работать с API Карт Google, я использовал учебник вРуководство разработчика: http://developer.android.com/resources/tutorials/views/hello-mapview.html

На каждом этапе пути я пытался точно понять, что происходит.И по большей части, я получил это.Единственное, что я не понимаю, это ссылки на контекст.В частности, в классе HelloItemizedOverlay в этом учебном пособии есть строка

Context mContext;

, а позже есть два конструктора, один из которых принимает объект Context в качестве аргумента, а другой - нет.

public HelloItemizedOverlay(Drawable defaultMarker){
        super(boundCenterBottom(defaultMarker));
}

public HelloItemizedOverlay(Drawable defaultMarker, Context context){
        super(boundCenterBottom(defaultMarker));
        mContext = context;
}

Элемент Context, по-видимому, вступает в игру позже в этом классе в методе onTap:

@Override
protected boolean onTap(int index){
    OverlayItem item = mOverlays.get(index);
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle(item.getTitle());
    dialog.setMessage(item.getSnippet());
    dialog.show();
    return true;
}

Однако в руководстве не объясняется, как работает AlertDialog.Builder.- это как бы выбрасывает это.И кажется, что понимание цели этого имеет решающее значение для понимания того, почему существует объект Context.

В основном (и единственном) упражнении для этого урока следующие строки, по-видимому, взаимодействуют с HelloItemizedOverlayclass:

List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
**HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);**

GeoPoint point = new GeoPoint(19240000, -99120000);
OverlayItem overlayitem = new OverlayItem(point, "Hello World!", "Ciudad Mexico");

itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);

Строка, помеченная **, является строкой, которая ссылается на конструктор для класса HelloItemizedOverlay.Однако эта строка вызвала ошибку NullPointerException в методе onTap, что имеет смысл, поскольку этот метод использует mContext, которому никогда не присваивается значение.После поиска в StackOverflow я обнаружил, что это ошибка в учебнике, и что ее можно исправить, изменив строку на

**HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);**

, что, действительно, сработало.

Так что мойвопросы:

Что такое контекст?Я не смог найти четкого и подходящего ответа в Интернете.

Почему и как используется Контекст в этом учебном пособии и в общих настройках Карт Google?

Что такоес двумя конструкторами?

Спасибо!

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

Что такое контекст?

Context - это класс предков Activity (и других классов).Он обеспечивает доступ к таким вещам, как ресурсы.Вам часто нужно предоставить Context различным методам и конструкторам.Если вы находитесь в компоненте (например, MapActivity), в большинстве случаев достаточно использовать this.

Почему и как используется Контекст в этом учебном пособии и в настройках Карт Googleв общем?

Ваш MapActivity наследуется от Context.

0 голосов
/ 31 декабря 2011

Вам может понадобиться контекст приложения по нескольким причинам.В этом руководстве вам понадобится создать всплывающее диалоговое окно, когда пользователь нажимает на экземпляр ItemizedOverlay.В этом диалоговом окне отображаются текст заголовка и фрагмента этого элемента.

...