android - 在 Fragment 而不是 Activity 中显示搜索结果

标签 android android-fragments

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

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

我认为主要问题在于 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));

MainActivity.class 调用 setSearchableInfo() 什么都不做,用 SearchListFragment.class 调用它会导致 NPE。

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

你能知道如何解决这个问题吗?

最佳答案

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

如下更改您的 list :

    <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>

这包括新的启动模式或“singleTop”、“搜索” Intent 和所需的元数据

在 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了解详情。

我认为这些是所有的修改。这不是一个完整的解决方案,但我希望它能让您走上解决其余问题的道路。

关于android - 在 Fragment 而不是 Activity 中显示搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539590/

相关文章:

android - 在Activity中使用ArrayList作为fragment中RecyclerView Adapter的内容

android - 将选定的值传递给另一个 Activity (使用 recycleview/textView)

java - 当我使用 FragmentPagerAdapter 将 fragment 添加到 Activity 中时,如何从 Activity 中调用 fragment 方法?

java - 单击 ActionBar 菜单时显示 fragment 返回 null

Android Fragments 在方向改变时重新创建

android - 如何在 Android 上自动播放 HTML5 mp4 视频?

android - 用于蓝牙通信的 OutputStream 到 DataOutputStream

安卓.view.InflateException : Binary XML file line #6: Error inflating class <unknown> while initializing progress bar

android - 如何将 fragment 添加到 ViewPager? addView 使我的应用程序崩溃

java - 同一 Fragment 中的多个 ViewPager