2017-03-01 29 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項目,以便您可以看到。 –