在片段中显示搜索结果,而不是活动

时间:2017-03-01 18:47:00

标签: android android-fragments

我正在尝试按照此处的示例在现有应用中实施搜索:
http://www.materialdoc.com/search-filter/

该应用程序使用片段替换来更改显示,因此我尝试在另一个片段中显示结果,而不是创建另一个活动。问题是当输入搜索字符串并且放大类是它时,不会调用任何处理程序。

我认为主要问题出在MainActivity.onCreateOptionsMenu()中的代码中:

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    ComponentName componentName = new ComponentName(this, MainActivity.class);
    // ComponentName componentName = new ComponentName(this, SearchListFragment.class); // results in NPE
    searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));

使用setSearchableInfo()致电MainActivity.class不会做任何事情,并使用SearchListFragment.class调用它会导致NPE。

我在这里创建了一个SSCCE:
https://github.com/emnrd-ito/SearchFragmentTest

你能看到如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

以下内容可以帮助您完成大部分工作:

按以下方式更改您的清单:

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.SEARCH" />

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

这包括一个新的启动模式或&#34; singleTop&#34;,&#34;搜索&#34;意图,以及所需的meta-data

在MainActivity中:

<强> OnCreateOptionsMenu

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
//  ComponentName componentName = new ComponentName(this, SearchListFragment.class);
//  searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));

    return true;
}

<强> onNewIntent

@Override
public void onNewIntent(Intent intent) {
    Log.d("onNewIntent", "here!");
}

您必须展开onNewIntent才能进行搜索。 Intent包含搜索条件。有关详细信息,请参阅this

我认为这些都是修改。这不是一个完整的解决方案,但我希望它能帮助你找到剩下的工作。