не позволять компоненту Android MapView Search порождать новое намерение

Я реализовал версию словаря с возможностью поиска Google, и у меня есть проблемы.

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

Однако, когда я выбираю элемент поиска из списка, исходное намерение, вызвавшее поисковую активность, кажется, обрабатывает событие, а новое намерение MapView порождается и делает то же самое (так что, если бы я нажал кнопку «назад» , Я возвращаюсь к дублированному mapView).

Мой класс Mapview выглядит так:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.my_map);

    initializeComponents();

    addOverlays();

    Intent intent = getIntent();

    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        // handles a click on a search suggestion; launches activity to show word
        int lat, lon;
        Uri uri = intent.getData();
        Cursor c = getContentResolver().query(uri, null, null, null, null);
        try {
            c.moveToFirst();
            lat = Integer.parseInt(c.getString(2));
            lon = Integer.parseInt(c.getString(6));
        } finally {
            c.close();
        }

        //this is the ItemizedOverlay that holds the building icons
        buildingIcons.onTap(new GeoPoint(lat, lon), mapView);

        Toast.makeText(this, "you searched for " + lat + ", " + lon, Toast.LENGTH_LONG).show();
    } 
}

Самое безумное, что уведомление Toast работает нормально - оно дает мне широту / долготу точки (и да, я знаю, что индекс столбца - не лучший способ получить его). Любые идеи о том, почему создается второе намерение MapView?

Если вам это нужно, вот файл searchchable.xml:

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    android:searchSettingsDescription="@string/settings_description"
    android:searchSuggestAuthority=".map.DictionaryProvider"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestIntentData="content://.map.DictionaryProvider/dictionary"
    android:searchSuggestSelection=" ?"
    android:searchSuggestThreshold="1"
    android:includeInGlobalSearch="true"
    >


person josh-cain    schedule 11.03.2011    source источник


Ответы (1)


Хорошо, понял. В документации четко указано

По умолчанию Activity с возможностью поиска получает намерение ACTION_SEARCH с вызовом onCreate (), и новый экземпляр Activity переносится на вершину стека действий. Теперь в стеке действий есть два экземпляра вашего Activity с возможностью поиска (поэтому нажатие клавиши BACK возвращает к предыдущему экземпляру Activity с возможностью поиска, а не для выхода из Activity с возможностью поиска).

Если вы установите android: launchMode на «singleTop», тогда доступное для поиска Activity получит намерение ACTION_SEARCH с вызовом onNewIntent (Intent), передав здесь новое намерение ACTION_SEARCH.

Мне пришлось переопределить метод onNewIntent для обработки события поиска. Теперь все работает нормально!

person josh-cain    schedule 13.03.2011