【问题标题】:Starting a new activity from a subclass with a listener从带有侦听器的子类开始新活动
【发布时间】:2012-01-04 10:01:22
【问题描述】:

为了检测地图移动和手势并为我的地图项使用延迟加载支持,我正在尝试使用这个库:http://code.google.com/p/mapview-overlay-manager/

我已经设置了一个附加到 overlayManager 的地图,并且事件正在顺利进行。我可以向听众敬酒。当我获得应用程序上下文时,它不为空。

我一直在尝试从 ManagedOverlay 类启动一个意图。特别是在下面的onDoubleTap 方法中,我正在尝试启动一个意图并收到以下错误消息:

 Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

我想我通常理解我需要回调 MapActivity 子类并让它启动意图,或者我需要对上下文做一些不同的事情。但是,我在解决具体问题时遇到了麻烦。任何帮助表示赞赏。

public class SiteMapRev2 extends MapActivity {

    private MapView mapView;
    private OverlayManager overlayManager;
    private MapController mapController;
    private MyLocationOverlay userLocationOverlay;
    private ArrayList<SiteSummary> sitesRoster = null;
    private Drawable siteIcon;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        mapView = (MapView) findViewById(R.id.mapview);      
        mapView.setBuiltInZoomControls(true);

        overlayManager = new OverlayManager(this, mapView);

        sitesRoster = new ArrayList<SiteSummary>(); 
        userLocationOverlay = new MyLocationOverlay(this, mapView);

        mapView.getOverlays().add(userLocationOverlay);
        mapController = mapView.getController();
        mapController.setZoom(14);
        siteIcon = this.getResources().getDrawable(R.drawable.marker2);

    }



    @Override
    public void onStart() {
        super.onStart();
        Drawable defaultmarker = getResources().getDrawable(R.drawable.marker2);

        ManagedOverlay managedOverlay = overlayManager.createOverlay("sites", defaultmarker);

        managedOverlay.setOnOverlayGestureListener(new ManagedOverlayGestureDetector.OnOverlayGestureListener(){

            public boolean onDoubleTap(MotionEvent arg0, ManagedOverlay arg1,
                    GeoPoint arg2, ManagedOverlayItem arg3) {

                if (arg3 == null) {
                    return false;
                }
                else {
                    **SiteOverlayItem thisItem = (SiteOverlayItem) arg3;
                    String siteIDAsString = Integer.toString(thisItem.getSiteID());
                    Context c = getApplicationContext();
                    Intent showSiteDetails = new Intent(c,SiteDetailActivity.class);
                    Log.d(toString(), "intent = " + showSiteDetails.toString());
                    showSiteDetails.setData(Uri.parse(siteIDAsString));
                    c.startActivity(showSiteDetails);
                    return true;**
                }

            }

【问题讨论】:

    标签: android android-activity map android-intent


    【解决方案1】:

    我会这样做,而不是获取应用程序上下文:

    SiteMapRev2.this.startActivity(showSiteDetails);
    

    像往常一样从您的地图活动开始活动。

    【讨论】:

      【解决方案2】:

      根据你的意图设置这个标志,Logcat 太聪明了,试着理解它对你说的话;)

      showSiteDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      

      【讨论】:

      • 这会丢失导航返回堆栈,虽然正确?我应该在我的问题中注意到这一点,但是对于我的 UI 场景,保留后台堆栈是必要的。
      • 那就不要使用Application上下文,直接使用你当前Activity的上下文即可。如果这不起作用,那么您的逻辑不正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多