【问题标题】:Mapview start new activity when a baloonOverlay is clicked单击 baloonOverlay 时 Mapview 开始新活动
【发布时间】:2011-02-21 20:40:27
【问题描述】:

嗨,我已经实现了一个带有投影点的谷歌地图,所以当我点击一个点时,它会打开一个气球,显示一些与之相关的信息。我使用了这个github 资源,这使它变得非常容易(感谢 Paul Sasik 的指导)。我想要的是,当我单击每个气球时,它应该打开一个新的 Activity,我尝试在其 onTap 方法中实现它,但问题是我无法在从框架布局类扩展的类中启动活动。所以这是我的代码:

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.

            }
    }

//----我调用startActivity的类ItemizedOverlay-----

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 show overlay details when clicked

上面的图片与我得到的类似,所以当我点击覆盖时,这应该会启动一个新的意图活动,我想在其中显示一些细节。

但是当我点击它时,我得到了这些错误。我不确定我是否以正确的方式做这件事。单击图像时,我正在调用 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)

【问题讨论】:

    标签: android


    【解决方案1】:

    非常简单的解决方法:

    替换这个:

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

    用这个:

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

    使用您从覆盖类中传递的MapView 获得的context 变量开始您的活动。

    【讨论】:

    • 按照上面的帖子,我的问题得到了解决,但现在还有另一个问题。我有两个地图活动,第一个如上所示,所以当我点击它时,它会打开一个新活动,其中包含一个包含一些细节的滚动视图和一个底部的小地图。因此,当我从这个新活动返回到我的 privious 大地图视图时,我收到了一些警告,并且地图未加载仅显示先前加载的部分的一半。我在互联网上搜索,您似乎无法同时处理两个地图活动,需要使用我尝试过的不同流程
    • 我在互联网上搜索,似乎您无法同时处理两个地图活动,因此需要使用不同的流程尝试但没有工作链接发布:stackoverflow.com/questions/3379575/…,我的警告获取类似于 java.lang.IllegalStateException: Connection pool closed.
    【解决方案2】:

    这是一个完整的实现示例,使用onBallonTap 启动一个新的Activity(使用startActivitystartActivityForResult)。

    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;
      }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 2016-11-25
      相关资源
      最近更新 更多