Mapview начать новое действие при нажатии на baloonOverlay - PullRequest
2 голосов
/ 21 февраля 2011

Привет! Я реализовал карту Google с точками проекции, поэтому, когда я щелкаю точку, она открывает всплывающую подсказку с некоторой информацией, относящейся к ней.Я использовал этот ресурс github , что делает его довольно простым (спасибо Полу Сасику за руководство).Что я хочу, так это когда я нажимаю на каждый шарик, он должен открыть новую активность, я пытался реализовать ее в методе onTap, но проблема в том, что я не могу запустить startActivity в классе, который расширен от класса framelayout.Итак, вот мой код:

public class CouponMapView extends MapActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
               ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, mapView);
               //all the mapoverlay code goes here...........
               //this part works fine.

            }
    }

// ---- Класс ItemizedOverlay, в котором я вызываю startActivity -----

public class ItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> overlays = new ArrayList<OverlayItem>();
    private Context context;
    private int id;

    public ItemizedOverlay(Drawable defaultMarker, MapView mapView) {
        super(boundCenter(defaultMarker), mapView);
        context = mapView.getContext();
    }

    public void addOverlay(OverlayItem overlay) {
        overlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return overlays.get(i);
    }

    @Override
    public int size() {
        return overlays.size();
    }

    @Override
    protected boolean onBalloonTap(int index) {
//---I cant call startActivity here as this class is not inhereted from Activity its //extended from a class that is extended from FrameLayout that you will find if you scroll down.
        SubActivity sub = new SubActivity();
        sub.startCustomActivity();
        return true;
    }
}

// - Чтобы начать новое действие и вызвать метод startActivity, мне нужно создать новый класс и расширить его из Activity ...

public class SubActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void startCustomActivity(){
        Intent Details = new Intent(getBaseContext(), Tab.class);
        Details.putExtra("Id", 1327);
        startActivity(Details);
    }

}

Вывод: не могу вставить изображение напрямую, ссылка на это mapView показать детали наложения при нажатии

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

Но когда я нажимаю на него, я получаю эти ошибки.Я не уверен, правильно ли я это делаю.Я вызываю класс subActivity при нажатии на изображение.

02-21 19:21:44.769: ERROR/AndroidRuntime(462): FATAL EXCEPTION: main
02-21 19:21:44.769: ERROR/AndroidRuntime(462): java.lang.NullPointerException
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.content.ComponentName.<init>(ComponentName.java:75)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.content.Intent.<init>(Intent.java:2678)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at com.vouchacha.mvc.mapview.SubActivity.startCustomActivity(SubActivity.java:17)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at com.vouchacha.mvc.mapview.ItemizedOverlay.onBalloonTap(ItemizedOverlay.java:52)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at com.vouchacha.mvc.mapview.BalloonItemizedOverlay$1.onTouch(BalloonItemizedOverlay.java:177)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.View.dispatchTouchEvent(View.java:3762)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
02-21 19:21:44.769: ERROR/AndroidRuntime(462):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

очень простое разрешение для этого:

замените это:

SubActivity sub = new SubActivity();
sub.startCustomActivity();

на это:

Intent Details = new Intent(context, Tab.class);
Details.putExtra("Id", 1327);
context.startActivity(Details);

используйте переменную context, полученную из MapView Вы прошли в своем оверлейном классе, чтобы начать свою деятельность.

2 голосов
/ 21 февраля 2011

Вот полный пример реализации, использующий onBallonTap для запуска нового Activity (используя startActivity и startActivityForResult).

public class StoreItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> {

  private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
  private Context mContext;
  private Activity mActivity;
  private StoreGroup mGroup;
  private boolean mCheckIn;

  public StoreItemizedOverlay(Drawable defaultMarker, MapView mapView, 
        Activity activity, StoreGroup group, boolean checkIn) {
    super(boundCenterBottom(defaultMarker), mapView);
    mContext = mapView.getContext();
    mGroup = group;
    mCheckIn = checkIn;
    mActivity = activity;
  }

  public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
  }

  @Override
  protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
  }

  @Override
  public int size() {
    return mOverlays.size();
  }

  @Override
  protected boolean onBalloonTap(int index) {
    try {
        Store store = mGroup.getStore(index);
        Intent intent = new Intent(mContext, StoreActivity.class);
        intent.putExtra("store", store.toJSONObject().toString());
        if (mCheckIn) {
            intent.putExtra("checkin", mCheckIn);
            mActivity.startActivityForResult(intent, 0);
        } else
            mContext.startActivity(intent);
    } catch (JSONException e) {
        Log.d(TAG, "Store JSON encoding error", e);
    }
    return true;
  }

}

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