谷歌地图标记怪异的行为

时间:2013-11-24 14:37:32

标签: android google-maps google-maps-markers infowindow

这是一个奇怪的,我希望有人至少可以给我一个指导方向。

我的Android应用程序使用GoogleMap API v2。在应用程序中,我在其中一个标记上运行OnClickInfoWindowListener上的活动。具体来说,当我点击特定标记时,会出现该标记的InfoWindow。接下来当我点击InfoWindow时,它会启动另一个活动。

问题是当我从该活动返回GoogleMap时,启动该活动的特定标记没有响应。通过响应,我的意思是当我点击它时,我没有得到InfoWindow。其他标记没有这样的问题。要解决此问题,我可以移动或缩放地图或单击另一个标记以显示其InfoWindow,然后原始标记正常工作。我在LogCat上看不到任何红色东西。

我还从ListView运行地图,没有问题(我可以看到)。

非常欢迎任何关于该看什么的建议!

编辑1:

这部分是InfoWindowClickListener设置......

        // Set up info Window Click Listener
        googleMap
                .setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

                    @Override
                    public void onInfoWindowClick(Marker mkr) {
                        // Default open file
                        // menu option : edit file information
                        // menu option : delete
                        Log.d(TAG, "InfoWindow Click detected.");
                        final GeoFileData gfd = getFromHashMap(mkr);

                        if (editGeoFile) {
                            editGeoFile = false;

                            editFileInfo(gfd);
                        } else if (deleteGeoFile) {
                            deleteGeoFile = false;

                            deleteFile(gfd, mkr);
                        } else {

                            openFile(gfd);
                        }
                    }

                });

启动Activity的openFile例程

// Public and Routines used by the main loop
private void openFile (GeoFileData gfd) {

    int typeIndex = gfd.getTypeIndex();

    switch(typeIndex) {
        case 0 :
        case 1 :
        case 2 :
        case 3 :
            // Spen file by default
            Intent notePadIntent = new Intent(getBaseContext(), NotePad.class);
            Bundle b = new Bundle();
            b.putParcelable(MAIN_NOTEPAD_GFD, gfd);
            notePadIntent.putExtras(b);

            startActivityForResult(notePadIntent, SPEN_NOTEPAD_CODE);

            break;
        default :
            Log.w(TAG, "Unknown file.");
            Toast.makeText(this, getString(R.string.toast_unknown_file), Toast.LENGTH_LONG).show();

            break;
    }
}

已启动活动的起始部分

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spen_notepad);

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        inputGfd = extras.getParcelable(PreznsActivity.MAIN_NOTEPAD_GFD);
    }
    extras.clear();

    mContext = this;

    // Spen
    boolean isSpenFeatureEnabled = false;
    Spen spenPackage = new Spen();
    try {
        spenPackage.initialize(this);
        isSpenFeatureEnabled = spenPackage.isFeatureEnabled(Spen.DEVICE_PEN);
    } catch (SsdkUnsupportedException e) {
        if( SDKUtils.processUnsupportedException(this, e) == true) {
            return;
        }
    } catch (Exception e1) {
        Toast.makeText(mContext, "Cannot initialize Spen.",
            Toast.LENGTH_SHORT).show();
        e1.printStackTrace();
        finish();
    }

    FrameLayout spenViewContainer =
        (FrameLayout) findViewById(R.id.spenViewContainer);
    RelativeLayout spenViewLayout =
        (RelativeLayout) findViewById(R.id.spenViewLayout);

    // PenSettingView
    mPenSettingView =
        new SpenSettingPenLayout(mContext, new String(),
            spenViewLayout);
    if (mPenSettingView == null) {
        Toast.makeText(mContext, "Cannot create new PenSettingView.",
            Toast.LENGTH_SHORT).show();
        finish();
    }
    // EraserSettingView
    mEraserSettingView =
        new SpenSettingEraserLayout(mContext, new String(),
            spenViewLayout);
    if (mEraserSettingView == null) {
        Toast.makeText(mContext, "Cannot create new EraserSettingView.",
            Toast.LENGTH_SHORT).show();
        finish();
    }
    // TextSettingView
    mTextSettingView = new SpenSettingTextLayout(mContext, new String(), new HashMap<String, String>(), spenViewLayout);
    if (mTextSettingView == null) {
        Toast.makeText(mContext, "Cannot craeate new TextSettingView.", Toast.LENGTH_SHORT).show();
        finish();
    }
    spenViewContainer.addView(mPenSettingView);
    spenViewContainer.addView(mEraserSettingView);
    spenViewContainer.addView(mTextSettingView);

    // SpenSurfaceView
    mSpenSurfaceView = new SpenSurfaceView(mContext);
    if (mSpenSurfaceView == null) {
        Toast.makeText(mContext, "Cannot create new SpenSurfaceView.",
            Toast.LENGTH_SHORT).show();
        finish();
    }
    spenViewLayout.addView(mSpenSurfaceView);
    mPenSettingView.setCanvasView(mSpenSurfaceView);
    mEraserSettingView.setCanvasView(mSpenSurfaceView);
    mTextSettingView.setCanvasView(mSpenSurfaceView);

    //
    Display display = getWindowManager().getDefaultDisplay();
    mScreenRect = new Rect();
    display.getRectSize(mScreenRect);
    // SpenNoteDoc
    try {
        mSpenNoteDoc =
            new SpenNoteDoc(mContext, mScreenRect.width(), mScreenRect.height());
    } catch (IOException e) {
        Toast.makeText(mContext, "Cannot create new NoteDoc",
            Toast.LENGTH_SHORT).show();
        e.printStackTrace();
        finish();
    } catch (Exception e) {
        e.printStackTrace();
        finish();
    }
    // NoteDoc
    mSpenPageDoc = mSpenNoteDoc.appendPage();
    mSpenPageDoc.setBackgroundColor(0xFFD6E6F5);
    mSpenPageDoc.clearHistory();
    // PageDoc
    mSpenSurfaceView.setPageDoc(mSpenPageDoc, true);

    initSettingInfo();
    // Listener
    mSpenSurfaceView.setTouchListener(mPenTouchListener);
    mSpenSurfaceView.setColorPickerListener(mColorPickerListener);
    mSpenSurfaceView.setTextChangeListener(mTextChangeListener);
    mSpenSurfaceView.setReplayListener(mReplayListener);
    mSpenPageDoc.setHistoryListener(mHistoryListener);
    mEraserSettingView.setEraserListener(mEraserListener);
    mSpenSurfaceView.setFlickListener(mFlickListener);

    // Button
    mTextObjBtn = (ImageView) findViewById(R.id.textObjBtn);
    mTextObjBtn.setOnClickListener(mTextObjBtnClickListener);

    mPenBtn = (ImageView) findViewById(R.id.penBtn);
    mPenBtn.setOnClickListener(mPenBtnClickListener);

    mEraserBtn = (ImageView) findViewById(R.id.eraserBtn);
    mEraserBtn.setOnClickListener(mEraserBtnClickListener);

    mUndoBtn = (ImageView) findViewById(R.id.undoBtn);
    mUndoBtn.setOnClickListener(undoNredoBtnClickListener);
    mUndoBtn.setEnabled(mSpenPageDoc.isUndoable());

    mRedoBtn = (ImageView) findViewById(R.id.redoBtn);
    mRedoBtn.setOnClickListener(undoNredoBtnClickListener);
    mRedoBtn.setEnabled(mSpenPageDoc.isRedoable());

    mImgObjBtn = (ImageView) findViewById(R.id.imgObjBtn);
    mImgObjBtn.setOnClickListener(mImgObjBtnClickListener);

    mAddPageBtn = (ImageView) findViewById(R.id.addPageBtn);
    mAddPageBtn.setOnClickListener(mAddPageBtnClickListener);

    mTxtView = (TextView) findViewById(R.id.spen_page);
    mTxtView.setText("Page" + mSpenNoteDoc.getPageIndexById(mSpenPageDoc.getId()));

    selectButton(mPenBtn);

    String filePath = inputGfd.getFileDirectory();
    mFilePath = new File(filePath);
    if (!mFilePath.exists()) {
        if (!mFilePath.mkdirs()) {
            Toast.makeText(mContext,  "Save Path Creation Error", Toast.LENGTH_SHORT).show();
            return;
        }
    }

    mSpenPageDoc.startRecord();

    File loadFile = new File(inputGfd.getFileDirectory(), inputGfd.getFileName());
    if (loadFile.exists()) {
        loadNoteFile();
    } else {
        Log.w(TAG, "File does not exist!");
    }

    if(isSpenFeatureEnabled == false) {
        mToolType = SpenSurfaceView.TOOL_FINGER;
        mSpenSurfaceView.setToolTypeAction(mToolType,
            SpenSurfaceView.ACTION_STROKE);
        Toast.makeText(mContext,
            "Device does not support Spen. \n You can draw stroke by finger",
            Toast.LENGTH_SHORT).show();
    }
}

活动的一个回报

    private boolean saveNoteFile(final boolean isClose) {
    // file save
    // note file
    String saveFilePath = inputGfd.getFileDirectory() + File.separator;
    String fileName = inputGfd.getFileName();
    if (!fileName.equals("")) {
        saveFilePath += fileName;

        saveNoteFile(saveFilePath);
        if (isClose)
            finish();
    } else {
        Toast
        .makeText(mContext, "Invalid filename !!!", Toast.LENGTH_LONG)
        .show();
    }

    return true;
}

最后是破坏程序,

@Override
protected void onDestroy() {
    Log.d(TAG, "NotePad onDestroy()");

    super.onDestroy();

    if (mSpenNoteDoc != null && mSpenPageDoc.isRecording()) {
        mSpenPageDoc.stopRecord();
    }

    if (mPenSettingView != null) {
        mPenSettingView.close();
    }
    if (mEraserSettingView != null) {
        mEraserSettingView.close();
    }
    if (mTextSettingView != null) {
        mTextSettingView.close();
    }
    if(mSpenSurfaceView != null) {
        if (mSpenSurfaceView.getReplayState() == SpenSurfaceView.REPLAY_STATE_PLAYING) {
            mSpenSurfaceView.stopReplay();
        }
        mSpenSurfaceView.closeControl();
        mSpenSurfaceView.close();
        mSpenSurfaceView = null;
    }

    if(mSpenNoteDoc != null) {
        try {
            if (isDiscard)
                mSpenNoteDoc.discard();
            else
                mSpenNoteDoc.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        mSpenNoteDoc = null;
    }
};

谢谢!

2 个答案:

答案 0 :(得分:0)

这可能是Google Maps Android API v2本身的错误。

我遇到了它in my app。当您打开“Declusterification”演示时,单击中心有10的黄色标记,并在同一位置出现一个新标记(红色默认值),此新标记无法与显示信息窗口进行交互而不移动地图。

如果您碰巧找到SSCCE,我建议将其发布在gmaps-api-issues上。我会支持的。如果我找到显示此问题的简单示例,我还会在此处发布更新。

答案 1 :(得分:0)

关闭此问题。

GoogleMap标记展示了此主题中提到的异常情况,目前该问题已反馈给Google。这个问题有两个明显的“解决方法”,但它们的效果尚不清楚:

第一个解决方法:在.clear()的限制范围内工作。无法使用.clear()停用激活的标记。

第二种解决方法:从活动返回后,执行相机更新。这显然会重置标记的激活。