11

SearchViewの提案を受けようとしています。私はそれのためのカスタムコンテンツプロバイダを実装しました。私はこのlinkを参照して、SearchViewの提案を実装しました。私が直面してる問題は、私はここでsearchManager.getSearchableInfo(getComponentName())Android:getSearchableInfo(getComponentName())はnullを返しますか?

にNULL値を取得し、あるスニペットです:

のAndroidManifest.xml

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <provider android:name=".SearchProvider" 
     android:enabled="true" 
     android:authorities="com.example.currentlocationmapdemo" 
     android:grantUriPermissions="true" 
     android:exported="true"> 
     <grant-uri-permission android:pathPattern="*" /> 
    </provider> 
    <uses-library android:name="com.google.android.maps" /> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

がsearchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="label" 
android:hint="hint" 
android:searchSuggestAuthority="com.example.currentlocationmapdemo" 
android:searchSuggestSelection=" ? "> 

MainActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.searchview_in_menu, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    mSearchView = (SearchView) searchItem.getActionView(); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); // null returned 
mSearchView.setSearchableInfo(info); 

return true; 
} 

答えて

17

少なくとも一つのために - あなたがやっている1十分なものであるから検索すると - マニフェストで、その中にこのインテントフィルタを持っている必要があります。

<intent-filter> 
    <action android:name="android.intent.action.SEARCH" /> 
</intent-filter> 

ない場合は、searchManager.getSearchableInfo(getComponentName())は常にnullを返し、あなたの設定が無視されます。

これは私を1日殺しました - 私はそれがActionBarSherlockに関連していると思っていましたが、それでうまく動作しません。問題は、サンプルを短絡しようとしていたことです.-)

+1

現在、インテントフィルタが現在のアクティビティに含まれている場合にのみ、現在は動作させることができます。検索結果を表示する別のアクティビティに移動したいので、かなり悪化しています。何が起こっているのか分かっていれば、聞いていただければ幸いです。 – Erhannis

+0

これに迷う時間。インテントフィルターがありませんでした。 –

8

私はあなたのアプローチが間違っていると思います。 2つのアクティビティが必要です - 1:SearchView(ActionBarまたはレイアウト上)と2:SearchActivity(検索実行時に開始される)を持つ主なアクティビティ

多分あなたもそれを行うことができますが、わからないです。あなたのアプローチでACTION_SEARCHインテントを受けたいと思っていますか?私は2つのactivitesでそれをやった

Intent intent = getIntent(); 
if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
    String query = intent.getStringExtra(SearchManager.QUERY); 
    System.out.println("searching for: " + query); 
} 

をし、それが私の仕事:通常は、そのようなあなたのsearchActivityにOnCreateイベントでそれを行います。一つの追加の事は私がしなければならなかったと私は追加されたAndroidの検索チュートリアルでは見つかりませんでした:マニフェストに

<meta-data 
android:name="android.app.default_searchable" 
android:value=".SearchableActivity" /> 

を私MainActivityあなたの活動の

+0

私の実装は実際には正しいです。問題は非常にばかげたものでした。 menu.xmlには「<?xml version = "1.0" encoding = "utf-8"?> 'がありませんでした。ただし、xmlファイルにはエラーは表示されませんでした。 – FireAndIce

+4

'default_searchable'属性は正式に文書化されていない唯一のものです。ありがとうございました!私を夢中にする。 Androidのドキュメントは冗談です。 – EinLama

関連する問題