Android 将片段从SearchView更改为从后台级联

Android 将片段从SearchView更改为从后台级联,android,Android,我目前正在使用SearchView对象,以便为建议的输入提供我的应用程序功能 但是,当提交此小部件时,它会使用意图过滤器启动搜索。当我的应用程序在手机上运行时,这非常好,因为我要做的是启动搜索结果活动以显示响应但是在平板电脑上,我希望它将我的搜索结果加载到当前活动中的片段中 我希望我的应用程序尽可能统一(在电话/标签之间的交叉方面),因此我希望启动一个新的活动,将搜索词路由到需要的地方,而不是像建议的那样覆盖提交行为。在“结果”活动的电话中,我想在选项卡上将搜索词传递给上一个活动 因此,我想问-

我目前正在使用
SearchView
对象,以便为建议的输入提供我的应用程序功能

但是,当提交此小部件时,它会使用
意图过滤器
启动搜索。当我的应用程序在手机上运行时,这非常好,因为我要做的是启动搜索结果
活动
以显示响应但是在平板电脑上,我希望它将我的搜索结果加载到当前
活动中的片段中

我希望我的应用程序尽可能统一(在电话/标签之间的交叉方面),因此我希望启动一个新的活动,将搜索词路由到需要的地方,而不是像建议的那样覆盖提交行为。在“结果”活动的电话中,我想在选项卡上将搜索词传递给上一个活动

因此,我想问-您能将信息传递给backbackback中的前一个活动吗?

我当前的解决方案(脏的)是在同一个活动中有一个公共静态字符串,当
活动
恢复时,如果发现该字符串,将使用该术语启动搜索并清除静态变量

public class SearchCatchingActivity extends Activity {

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

    // Ensure this activity isn't in the backstack, notify the previous activity in the backstack that it should handle the search onResume()
    DualPaneActivity.searchTerm = getIntent().getStringExtra(SearchManager.QUERY);
    finish();

}
双重能动性:

if (!searchTerm.equalsIgnoreCase("")) {
    startSearchThread(searchTerm)
    searchTerm = "";
}

我建议您将搜索捕获活动作为路由活动。它可以捕获查询并将其传递给所需的活动(可以是带有结果片段的双窗格,也可以是带有单个结果片段的单个窗格)。当路由到下一个活动时,使用
FLAG\u ACTIVITY\u CLEAR\u TOP
intent标志,使其成为该实例的默认活动。记住对路由活动调用
finish()
,以便将其从后台删除。

我刚刚将活动的启动模式设置为singleTop,并为此处理onNewIntent方法

AndroidManifest.xml

<activity android:name=".MyActivity" android:launchMode="singleTop" android:theme="@style/Theme.MyTheme" >
    <intent-filter >
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>

    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

使用FLAG_ACTIVITY_CLEAR_TOP可以有效地删除backbackback中较低的活动实例,并在TOP上重新实例化它。当直接在上一个活动中使用时,您实际上是在backback中调用“Back”。
@Override
protected void onNewIntent (Intent intent) {

    MyFragment newFrag = new MyFragment();
    newFrag.setArguments(args);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    // remove previous show list fragment if it exists
    Fragment prev = getSupportFragmentManager().findFragmentByTag("myFrag");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.add(R.id.fragment_placeholder, newFrag, "myFrag");
    ft.commit();

}