Есть ли какое-то хорошее решение для поиска в TabActivity для каждого действия на вкладке соответственно? - PullRequest
3 голосов
/ 23 февраля 2011

У меня проблема с активностью навигации, поиск работает хорошо.

Иерархия действий выглядит так:

                              /  MyListActivityA -- ItemActivityA
MainActivity -- MyTabActivity -- MyListActivityB -- ItemActivityB
                              \  MyListActivityB -- ItemActivityC

Вкладки в TabActivity создаются с использованием Intents с MyListActivity .

MyListActivities объявлены в манифесте, как показано ниже:

    <activity
        android:name=".views.OrderListView">
        <intent-filter>
            <action
                android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable_orders" />
    </activity>

Каждый MyListActivity имеет собственный SearchRecentSuggestionsProvider.

Первая решенная проблема

При запуске поиска по любому из MyListActivity я получил активность за пределами MyTabActivity . Поэтому реализовано перенаправление на MyTabActivity .
В onCreate () MyListActivity проверяется намеренное действие. Если это

Intent.ACTION_SEARCH

затем запустите TabActivity и завершите текущий, как показано ниже:

    if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        intent.setClass(context, MyTabActivity.class);
        intent.setAction(MyTabActivity.ACTION_SEARCH_PROXY);

        Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);

        if(appData != null) {
            intent.putExtras(appData);
        }

        intent.putExtra(Constants.ACTIVITY_TYPE, activityType);
        intent.putExtra(ActivityTabView.EXTRA_SEARCH_QUERY, query);

        context.startActivity(intent);
        context.finish();
    }

Когда MyListActivity найти

ActivityTabView.EXTRA_SEARCH_QUERY

делает поисковый запрос по списку. И проблема решена.

Вторая решенная проблема

Нажатие кнопки «Назад» очищает поисковый запрос - это нормально. Но при нажатии «Назад» снова отображаются прошлые поиски.

Именно поэтому я поставил noHistory на MyTabActivity :

<activity
    android:name=".views.MyTabActivity"
    android:noHistory="true">
</activity>

Третья нерешенная проблема

Теперь, например, перейдя от MyListActivityA к ItemActivityA и нажав «Назад» перенаправляет на MainActivity . Я не могу вернуться к MyTabActivity из-за параметра noHistory.

Есть ли какое-либо хорошее решение для использования поиска Android в TabActivity для каждого действия на вкладке соответственно?

1 Ответ

3 голосов
/ 25 февраля 2011

Рекомендую прочитать Задачи и Back Stack . Это дало мне лучшее понимание стека действий в Android.

Мое решение:

Вызванный диалог быстрого поиска запускает действие, с помощью которого он был вызван, в данном примере это MyListActivity. Это делает TabActivity исчезнуть, поэтому нет видимого TabWidget. Поэтому в MyListActivity реализовано перенаправление на MyTabActivity (см. Первая решенная проблема ). MyTabActivity просто перенаправляет дополнительные функции с поисковым запросом, включенным в намерение для определенной MyListActivity.

Все, что вам нужно сделать сейчас, это добавить одну строку. Установите флаг FLAG_ACTIVITY_CLEAR_TOP для намерения, запускающего MyTabActivity.

if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
    String query = intent.getStringExtra(SearchManager.QUERY);
    intent.setClass(context, MyTabActivity.class);
    intent.setAction(MyTabActivity.ACTION_SEARCH_PROXY);

    Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);

    if(appData != null) {
        intent.putExtras(appData);
    }

    intent.putExtra(Constants.ACTIVITY_TYPE, activityType);
    intent.putExtra(ActivityTabView.EXTRA_SEARCH_QUERY, query);

    //added line
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    context.startActivity(intent);
    context.finish();
}

Тогда нормальная деятельность навигации сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...