2012-04-18 11 views
18

アクションバーに検索ビューを設定する際に問題があります。SearchInfoが常に出力されています

私は開発者のサイトに従っていますが、動作しません。私は何かが欠けていると感じる。

コードを実行すると、常に「検索可能な情報を取得できませんでした」(MainActivity.setupSearchView())が出力されます。

MainActivity.java

// package... 
// imports... 
public class MainActivity extends Activity { 
    private static String tag = "Main Activity"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater mi = getMenuInflater(); 
     mi.inflate(R.menu.search_view, menu); 
     setupSearchView(menu); 
     return true; 
    } 
    private void setupSearchView(Menu menu) { 
     SearchManager sm = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchableInfo si = sm.getSearchableInfo(getComponentName()); 
     if (si == null) { 
      Log.wtf(tag, "failed to get searchable info"); 
      return; 
     } 
     SearchView sv = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
     sv.setSearchableInfo(si); 
     // Do not iconify the widget; expand it by default 
     sv.setIconifiedByDefault(false); 
    } 
} 

SearchResultsActivity.java

// package... 
// imports... 
public class SearchResultsActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final Intent queryIntent = getIntent(); 
     doSearchQuery(queryIntent); 
    } 
    @Override 
    public void onNewIntent(final Intent newIntent) { 
     super.onNewIntent(newIntent); 
     final Intent queryIntent = getIntent(); 
     doSearchQuery(queryIntent); 
    } 
} 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:hint="@string/search_hint" 
    android:label="@string/search_label" > 
</searchable> 

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="kpaek.examples" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="15" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".search.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

答えて

38

私が見つけた重要なことは、searchable.xmlはではなく、にリテラル文字列とリソースのみが含まれていることです。私はgetSearchableInfoを静かに失敗させるので、その1日約半日を無駄にしました。

+0

ありがとうございました!あなたは私のために半日保存します:) – HighFlyer

+0

うわー!それは非常に悪いバグです。私はここにそれを報告した:https://code.google.com/p/android/issues/detail?id=37517 – Rodja

+0

男 - その情報のおかげです! – mAx

3

developersiteから:

検索構成はSearchViewの動作及びRES/XML/searchable.xmlファイルで定義され 方法を定義します。最低限検索可能な 設定には、Androidマニフェストの 要素のandroid:label属性と同じ値の を持つandroid:label属性が含まれている必要があります。一例として、

、彼らは示しています

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
     android:label="@string/app_name" 
     android:hint="@string/search_hint" /> 

APP_NAMEは、マニフェストのように、活動のラベルです。ただし、検索可能なラベルでは、ラベルはsearch_labelを参照します。おそらくapp_nameとsearch_labelが等しい場合には機能しますが、それは私には壊れやすいようです。

11

これは私を1日殺しました - 私はそれがActionBarSherlockに関連していると思っていましたが、それでうまく動作しません。

問題は、サンプルを短絡しようとしていたことでした。あなたの活動の少なくとも一つ - あなたから検索をやっている1で十分である - マニフェストで、その中にこのインテントフィルタを持っている必要があります。

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

ない場合は、searchManager.getSearchableInfo(getComponentName())は常にnullを返し、お使いのコンフィギュレーション無視されます。res/menu/mymenu.xmlでカスタムタグを使用して、私の場合は

19

は私のために働いた:

app:showAsAction="ifRoom|collapseActionView" 
app:actionViewClass="android.support.v7.widget.SearchView" 

使用しないでください:私は意図-フィルタおよびメタデータ要素がなければならないことを発見した

android:showAsAction="ifRoom|collapseActionView" 
android:actionViewClass="android.support.v7.widget.SearchView" 
+1

それは私のために働いた。どうもありがとうございました! –

+0

@maheshこれも私のために働いた! – Tony

17

マニフェストアクティビティ要素に含まれる getSearchableInfo(getComponentName())メソッドの検索が開始され(SearchViewを持つMainActivity)、nullではなく正しい構成が返されます。私は疑問に思う

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

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

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

代わりに、もし(と私は今のところでつもりだ溶液)1は、結果のアクティビティの宣言の意図とメタデータを残し、次のように)(getSearchableInfoに引数を変更する必要があります。

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

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

そしてMainActivityへの変更(searchableInfoの代入文を注意してください):

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_search, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView mySearchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(getApplicationContext(), SearchResultsActivity.class)); 
    mySearchView.setSearchableInfo(searchableInfo); 

    return true; 
} 
+1

ありがとうございました.....私のために働いた唯一の解決策は、新しいcomponentNameの1つです.....私は理由はわかりませんが、他のすべての人は仕事をしませんでした。 – Gaurav

+0

ああ、うわー!機能した唯一のソリューション!より多くのupvotesに値する! – camelCaseCoder

2

私はこの問題に遭遇しましたが、上記のアドバイスはそれを解決しませんでした。代わりに、SearchResultActivityでカテゴリのデフォルトを設定することが判明しました。たとえば、次の休憩:android.intent.category.DEFAULTを削除

<activity android:name=".SearchResultActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
    <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

は、この問題を解決:

<activity android:name=".SearchResultActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
    <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

また、この質問への回答以前はエラーを持っています。 MainActivityはandroid.app.default_searchableで定義する必要があります。 android.app.searchableは、SearchResultsActivityにのみ適用されます。結論SearchManagerで

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name"> 
    <!-- other stuff--> 
    <meta-data android:name="android.app.default_searchable" 
      android:value=".SearchResultsActivity" /> 
</activity> 

のAndroidManifest.xmlが完全でないときサイレント障害を受けやすい脆弱なコンポーネントです。

1

私は上記の解決策をすべて確認したので、私は8時間を無駄にしましたが、1つは私にとって欠けていました。私のAndroidのマニフェストに

<meta-data 
       android:name="android.app.searchable" 
       android:value="@xml/searchable" /> 

されている必要があります。

<meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 

私にとって、それは静かに失敗しました。最初に行うべき最良のことは、例をコピー&ペーストすることです。すべての属性がまったく同じであることを確認してください。

関連する問題