简体   繁体   English

是否有任何好的解决方案分别在TabActivity中为每个活动进行搜索?

[英]Is there any good solution for searching in TabActivity for each activity in tab respectively?

I have problem with Activities navigation, searching works good. 我有活动导航的问题,搜索效果很好。

Activities hierarchy looks like that: 活动层次结构如下所示:

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

Tabs in TabActivity are created using Intents with MyListActivity . TabActivity中的选项卡是使用带有MyListActivity的 Intents创建的。

MyListActivities are declared in manifest like below: 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>

Every MyListActivity has own SearchRecentSuggestionsProvider. 每个MyListActivity都有自己的SearchRecentSuggestionsProvider。

First resolved problem 首先解决了问题

When invoked search on any of MyListActivity I got the activity outside the MyTabActivity . 当在任何MyListActivity上调用搜索时,我获得了MyTabActivity 之外活动 Therefore implemented redirecting to MyTabActivity . 因此实现了重定向到MyTabActivity
In onCreate() of MyListActivity intent action is checked. MyListActivity的 onCreate()中, 检查意图操作。 If it's 如果它是

Intent.ACTION_SEARCH

then start TabActivity and finish current, like below: 然后启动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();
    }

When MyListActivity find MyListActivity找到时

ActivityTabView.EXTRA_SEARCH_QUERY

it makes search query on list. 它使列表上的搜索查询。 And problem resolved. 问题解决了。

Second resolved problem 第二个解决问题

Clicking "Back" button clears search query - that's ok. 单击“返回”按钮可清除搜索查询 - 这没关系。 But clicking "Back" again shows past searches. 但再次单击“返回”会显示过去的搜索。

That's why I put noHistory to MyTabActivity : 这就是为什么我把noHistory放到MyTabActivity

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

Third UNresolved problem 第三个尚未解决的问题

Now, for example, going from MyListActivityA to ItemActivityA and clicking "Back" redirects to MainActivity . 现在,例如,从MyListActivityA转到ItemActivityA并单击“Back”重定向到MainActivity I can't do back to MyTabActivity because of noHistory parameter. 我不能做回MyTabActivity因为noHistory参数。

Is there any good solution for using Android searching in TabActivity for each activity in tab respectively? 在TabActivity中分别对tab中的每个活动使用Android搜索有什么好的解决方案吗?

I recommend to read Tasks and Back Stack . 我建议阅读任务和后台堆栈 It gave me better understandings of activities stack in android. 它让我对android中的活动堆栈有了更好的理解。

My solution: 我的解决方案

Invoked Quick Search Dialog starts the activity by which it was invoked, in this example it is MyListActivity. 调用快速搜索对话框启动调用它的活动,在此示例中为MyListActivity。 That makes TabActivity dissapear, that's why there is no visible TabWidget. 这使TabActivity消失,这就是为什么没有可见的TabWidget。 Therefore in MyListActivity is implemented redirection to MyTabActivity (see First resolved problem ). 因此在MyListActivity中实现了重定向到MyTabActivity(参见First resolved problem )。 MyTabActivity just redirects extras, with search query, included in intent to specific MyListActivity. MyTabActivity只是通过搜索查询重定向附加内容,包含在特定MyListActivity的intent中。

All you have to do now is add one line. 你现在要做的就是添加一行。 Set FLAG_ACTIVITY_CLEAR_TOP flag on intent that starts MyTabActivity. 在启动MyTabActivity的intent上设置FLAG_ACTIVITY_CLEAR_TOP标志。

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();
}

Then normal activities navigation is preserved. 然后保留正常的活动导航。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM