2012-04-18 18 views
18

我在設置操作欄中的搜索視圖時遇到問題。SearchInfo總是出來null

我跟着開發者網站,但它不起作用。我感到我失去了一些東西。

當我運行我的代碼,它總是輸出「未能獲得搜索的信息」(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無聲無息地失敗。

+0

謝謝!你爲我省了半天:) – HighFlyer 2012-08-28 11:33:09

+0

哇!這是一個非常邪惡的錯誤。我在這裏報告:https://code.google.com/p/android/issues/detail?id=37517 – Rodja 2012-09-17 08:07:22

+0

男人 - 非常感謝這些信息! – mAx 2013-01-04 08:02:13

3

從developersite:

可搜索配置定義所述搜索查看的行爲及處於RES/XML/searchable.xml文件中定義 。至少,一個可搜索的 配置中必須包含一個機器人:的標籤屬性,或在你的Android清單 元素:具有 相同的值Android的標籤屬性。

舉個例子,它們顯示:

<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

這殺了我一天 - 我認爲這是ActionBarSherlock相關,但沒有它工作得很好這一點。

問題是我試圖短路樣品。至少你的活動之一 - 你從做搜索的一個就足夠了 - 必須有這個意圖過濾器在它的清單:

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

如果沒有,那麼searchManager.getSearchableInfo(getComponentName())始終返回null,並且配置被忽略。

19

在使用自定義標籤res/menu/mymenu.xml我的情況爲我工作:

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

不要使用:

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

它爲我工作。非常感謝你! – 2015-07-27 14:53:56

+0

@mahesh這也適用於我! – Tony 2017-11-05 12:30:32

17

我發現,意向過濾器和元數據元素必須是包含在清單中的活動元件從中可以在啓動搜索(具有搜索查看MainActivity)的方法getSearchableInfo(getComponentName())來返回正確的配置和不爲空。

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

我不知道如果不是(和解決方案,我有打算現在)應該留在結果活動聲明的意圖和元數據,改變參數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

感謝的人.....唯一的解決方案,爲我的工作是新的組件名稱一個.....我不知道爲什麼,但所有其他人沒有工作 – Gaurav 2015-11-07 08:22:01

+0

哇哦!唯一的解決方案!值得讚賞! – camelCaseCoder 2016-02-18 09:45:14

2

我遇到過這個問題,但上述建議並沒有解決這個問題。相反,它變成SearchResultActivity中的設置類別默認值。例如,下面的休息:

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

刪除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" /> 
    </intent-filter> 
    <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

而且以前這個問題的答案有錯誤。 MainActivity應android.app.default_searchable定義。 android.app.searchable僅供您SearchResultsActivity。

<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不完美時,SearchManager是一個容易發生無聲故障的脆弱組件。

1

我浪費了整整8個小時就這一個,因爲我檢查了所有上述解決方案,但有一兩件事失蹤了我。

在我的Android清單:

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

應該一直是:

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

對我來說是失敗的靜默。首先要做的最好的事情就是複製並粘貼示例。只要確保所有屬性完全相同。