2013-06-26 80 views
9

我一直堅持這一點,現在。我看了SO上的其他答案,但他們沒有幫我解決我的問題。搜索對話框不被調用onSearchRequested()

我的問題是搜索對話框不被onSearchRequested()調用。我無法弄清楚是怎麼回事,我的搜索...

相關的代碼如下...

清單

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity> 

/RES/XML/searchable.xml

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

</searchable> 

我在strings.xml定義字符串資源。

SearchableActivity類

public class SearchableActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d("SEARCH", "HERE"); 
      handleIntent(getIntent()); 
     } 

     public void onNewIntent(Intent intent) { 
      setIntent(intent); 
      handleIntent(intent); 
     } 

     public void onListItemClick(ListView l, View v, int position, long id) { 
      // call the appropriate detail activity 
     } 

     private void handleIntent(Intent intent) { 
      if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      doSearch(query); 
      } 
     }  

     private void doSearch(String queryStr) { 
      Toast.makeText(getApplicationContext(), queryStr, Toast.LENGTH_LONG).show(); 
     } 

} 

在被調用搜索活動的一段代碼...

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getTitle().equals("Search")) { 
     Toast.makeText(getApplicationContext(), "Search = "+onSearchRequested(), Toast.LENGTH_LONG).show(); 
     return onSearchRequested(); 
    } else { 
     return false; 
    } 
} 

onSearchRequested()將返回true。但沒有調用SearchableActivity。任何幫助表示讚賞。

非常感謝。


修訂

沒關係!我想到了!

解決的方法是將meta-data移動到activity標記之外並且在application標記內。已經添加到下面作爲解決這個問題的人的答案。

謝謝。

回答

1

UPDATE

你必須overrideonNewIntent()

變化艙單

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.default_searchable" 
     android:resource="@xml/searchable" 
     android:value=".SearchableActivity" /> 
</activity> 
+0

感謝。嘗試在'meta-data'中添加'android:value ='。SearchableActivity'但沒有幫助。 – neo108

+0

嗨試試覆蓋onNewIntent() –

2

得到它的工作。

的解決方案是移動meta-dataactivity標籤外部和application標籤內,下面...

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

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

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

謝謝!

+3

您是否感謝您回答自己的問題? – SK9

+2

這對我沒有用! –

+0

這可以工作,但並不需要將它放在活動標籤之外查看我的答案 – Tomasz

3

除非您希望應用程序中的每個活動都提供搜索對話框,否則不必將元數據移動到活動標記之外。它可能不適用於你的原因是因爲你把元數據放在錯誤的活動中,並將它移到外面解決問題。

<activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

它給沒有錯誤,但不工作:

不要活動調用它像這樣混淆ResearchActivity。工作示例:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme"> 
    <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> 

     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
    </activity> 
    <activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
</application> 

MainActivity是提供搜索對話框活動(可以是也search widget)和SearchableActivity是開始活動用戶請求的搜索和onSearchRequested()被調用後。

+0

Tomek給出了正確的答案我有主要活動和可搜索活動的單獨活動我期望主要活動可以調用可搜索活動我認爲Android真的很迷惑,有** android.app.default_searchable **和** android.app.default_searchable **,它們有着相似的命名但含義不同。它剛剛讓新的Android程序員感到困惑。 –

1

您需要聲明完整路徑搜索活動

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.example.search.SearchableActivity" /> 
+1

它解決了我的問題 –