Проблемы с возвращаемым значением логических методов - PullRequest
0 голосов
/ 25 августа 2011

У меня есть эта функция, чтобы показывать AlertDialog при прикосновении к маркеру:

protected boolean onTap(int index) {
        db = openHelper.getWritableDatabase();

    AlertDialog.Builder dialog = new AlertDialog.Builder(Geo.this);
    String[] columns_descri = new String[] {COL_DESCRI};
    Cursor cur = db.query(true, TABLE_COORD, columns_descri,null, null, null, null, null, null);
    if (cur.moveToPosition(index-1)) {
    String description = cur.getString(cur.getColumnIndexOrThrow(COL_DESCRI));
    dialog.setTitle("Info.");
    dialog.setMessage(description); 
    dialog.show();
    }
    db.close();
    return true;     } 

И этот метод для извлечения любого касания карты:

@Override
    public boolean onTouchEvent(MotionEvent event, MapView maMap) 
    {   
        //---when user lifts his finger---
        if (event.getAction() == 1) {                
            GeoPoint p = maMap.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());
                Toast.makeText(getBaseContext(), 
                    p.getLatitudeE6() / 1E6 + "," + 
                    p.getLongitudeE6() /1E6 , 
                    Toast.LENGTH_SHORT).show();
        }                            
        return true;
    }       

Проблема в том, когда onTouchEvent возвращает TRUE. Я не могу управлять картой, перемещать ее или показывать AlertDialog при прикосновении к маркеру.Когда он ложный, я снова беру контроль над картой, но тост отображается много раз (5 или 6 раз).Что может быть источником этой странной проблемы?

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Логическое значение событий onTap и onTouch представляет, было ли действие полностью обработано или нет. Если вы вернете true, ОС перестанет каскадно переходить на другие виды (поэтому вы теряете контроль над картой). Когда вы возвращаете false, ОС будет искать другие методы, которые могут обработать событие касания.

1 голос
/ 25 августа 2011

попробуйте

@Override
    public boolean onTouchEvent(MotionEvent event, MapView maMap) 
    {   
        //---when user lifts his finger---
        boolean result = false;
        if (event.getAction() == 1) {                
            GeoPoint p = maMap.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());
                Toast.makeText(getBaseContext(), 
                    p.getLatitudeE6() / 1E6 + "," + 
                    p.getLongitudeE6() /1E6 , 
                    Toast.LENGTH_SHORT).show();
            result true;
        }                            
        //return (result | super.onTouchEvent(event, mapView));
        return result;
    }    
0 голосов
/ 25 августа 2011

OnTouchEvent вызывается при КАЖДОМ событии касания.Нажмите, перетащите (много событий), отпустите.Поэтому ваш тост показывает много.вернуть true только внутри вашего условия if и вернуть false в противном случае.Это должно решить это.

...