2011-12-30 3 views
2

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

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

Context mContext; 

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

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

public HelloItemizedOverlay(Drawable defaultMarker, Context context){ 
     super(boundCenterBottom(defaultMarker)); 
     mContext = 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.

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

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, созданных в целом?

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

Спасибо!

+0

http://stackoverflow.com/questions/3572463/what-is-context-in-android – aromero

+0

Я читал это раньше, но я не понимал, как и почему он используется в этом контексте. Похоже, что это должен быть больше, чем ответ в этом вопросе, потому что мне кажется, что текущее состояние приложения действительно не вступает в игру. –

+0

Вы посмотрели http://developer.android.com/reference/android/content/Context.html? – user634618

ответ

1

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

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

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

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

+0

Не могли бы вы рассказать о том, как MapActivity наследует контекст? Я вижу, что Context передается как аргумент AlertDialog.Builder и не используется иначе, так что Context берет информацию из MapActivity и делится ею с AlertDialog.Builder? И почему учебник добавляет два конструктора, когда Контекст всегда передается? –

+0

http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapActivity.html – user802421

+0

ОК, теперь я понимаю, как MapActivity наследует от контекста. Что из двух других вопросов? –

0

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

+0

Как он используется для создания всплывающего окна? Мне кажется, что информация, переданная методу, генерирующему всплывающее окно, связана со специфическим выбранным элементом, а не с состоянием активности. Или аргумент, требуемый в этом методе, по причинам, не использованным в этом учебнике? –

+0

Контекст приложения может использоваться AlertDialog.Builder, если вы, например. хотите установить заголовок диалогового окна на строковый ресурс (строка в ваших res/string). В этом случае вы можете придумать контекст как способ доступа ко всем вашим ресурсам приложений, например, чертежи, строки, макеты и т. Д. – aspartame

Смежные вопросы