2017-03-01 31 views
0

我想实现在现有的应用程序搜索以下这里的例子:
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

你可以看到如何解决这一问题?

+0

我不确定你在做什么。在引用的示例中缺少一些片段,例如在清单中定义搜索“活动”并处理搜索“意图”。你是否想用'Fragment'来代替'Activity'?我错过了什么? – Cheticamp

+0

我正在尝试使用MainActivity,而不是其他活动。目前,该应用程序显示所有员工的列表,搜索到的员工列表是该列表的一部分,所以它会看到我可以以类似于所有员工列表的方式以某种方式显示该列表。 –

回答

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> 

这包括新的launchmode或“singleTop”,“搜索”的意图,以及需要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

我认为这些都是所有的修改。这不是一个完整的解决方案,但我希望它能让你找出其余的问题。

+0

我会试试这个,但我不确定它会起作用。我尝试使用'onNewIntent'玩,并且无法使其工作,因为只有在重新启动活动时才会调用它。 –

+0

确保你将'android:launchMode =“singleTop”'放入清单,否则搜索将通过'onCreate'进行,而这不是你想要的。这将工作。 – Cheticamp

+0

我已经实现了你建议的代码。现在调用'onNewIntent'更好。当我尝试之前,我认为我没有在清单中正确设置(基于查看您的代码)。仍然有一个问题,那就是不显示列表。标题显示,但不是列表。在调试中,我看到适配器中的列表正在构建,但不知何故只是不显示。我已将更改推送到github项目,以便您可以看到。 –