2012-08-08 106 views
6

我想在我的android應用程序中使用搜索欄小部件在操作欄中執行搜索。搜索欄小部件不能開始搜索活動

我下面

http://developer.android.com/guide/topics/search/search-dialog.html http://developer.android.com/guide/topics/ui/actionbar.html#ActionView

教程來完成這件事。

我有兩個活動涉及搜索。 SearchBar活動具有操作欄,AcceptSearch是我可搜索的活動。即使我宣佈哪個活動是可搜索的活動,該查詢不會被髮送到AcceptSearch,並且該活動不會啓動。

我配置了搜索欄,使得當widget爲空時出現搜索欄提示,但提示從未出現。這是我的代碼。

搜索欄

public class SearchBar extends Activity 
{ 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.search_bar); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    //Inflate the options menu from XML 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 

    // Get the SearchView and set the searchable configuration 
    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setIconifiedByDefault(false);   
    return true;   
} 

AcceptSearch

public class AcceptSearch extends ListActivity 
{ 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{  
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash_screen); 

    //Get the intent, verify the action and get the query 
    Intent intent = getIntent(); 
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) 
    { 
     String query = intent.getStringExtra(SearchManager.QUERY); 

     //Start the search 
     doMySearch(); 
    } 
} 

Searchable.xml

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

options_menu

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" >  
<item 
    android:title="Help" 
    android:id="@+id/menu_help" 
    android:showAsAction="always" 
/> 
<item 
    android:title="Categories" 
    android:id="@+id/menu_cats" 
    android:showAsAction="always" 
/> 
<item 
    android:id="@+id/menu_search" 
    android:title="Search with Searchlet" 
    android:icon="@drawable/ic_action_search" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:actionViewClass="android.widget.SearchView"/> 
</menu> 

清單

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.searchlet" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="15" /> 

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

    <activity 
     android:name=".SplashScreenActivity" 
     android:label="@string/title_activity_splash_screen" 
     android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

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

    <activity android:name=".SearchBar" 
       android:label="@string/app_name">     
     <intent-filter> 
      <action android:name="com.example.searchlet.CLEARSCREEN" /> 
      <category android:name="android.intent.category.DEFAULT" /> 

     </intent-filter> 
    </activity> 

</application> 

</manifest> 

我beleive這就是所有需要的信息來重新創建情況。

謝謝大家提前。我很感激。

+0

具有u得到這個問題的解決?如果是,請讓我知道我也在這裏被困住了。 – 2013-07-16 06:04:23

+0

@Lalit你有沒有找到解決方案?我也卡在這裏。 – Solace 2014-12-23 09:18:05

回答

7

我有類似的問題。我正在關注grokking's tutorial,活動從未開啓。我嘗試了Indrek爲我工作的解決方案。

您應該確定您擁有正確的父母下的正確的元數據。元數據

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

應該在申請中。跟隨元數據

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

應該在AndroidManifest.xml中的搜索活動參數下。

在搜索活動中,我做了以前鏈接的用於管理活動堆棧的教程中所說的內容。我希望這個解決方案適用於所有遇到同樣問題的人。

18

該教程似乎缺少一個重要部分。您必須在<application>標籤內添加<meta-data android:name="android.app.default_searchable" android:value=".MySearchActivityName" />

+0

謝謝,我會在早上嘗試這個解決方案。 (謝謝你的回覆) – myselfesteem 2012-09-11 04:33:52

+1

是的,那不是那個答案:( – myselfesteem 2012-10-06 05:09:45

+0

謝謝,這對我有幫助 – 2013-08-18 12:02:16

1

您錯過了'.SearchBar'Manifest文件中的元數據,它指向'。AcceptSearch'活動。

添加元數據如下,以 '.SearchBar' 活動:

<!-- search widget target activity--> 
     <meta-data android:name="android.app.default_searchable" 
        android:value=".AcceptSearch" /> 

這裏被更新的 '.SearchBar' 活動清單代碼。

<activity android:name=".SearchBar" 
       android:label="@string/app_name"> 
     <!-- search widget target activity--> 
     <meta-data android:name="android.app.default_searchable" 
       android:value=".AcceptSearch" /> 
     <intent-filter> 
      <action android:name="com.example.searchlet.CLEARSCREEN" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
2

Pau Arlandis Martinez,謝謝。您的解決方案可以正常工作,而使用活動堆棧的教程很有幫助我投入<application>節這個元數據:

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

而且我注意到,@覆蓋onQueryTextSubmit方法應返回false開始搜索活動。否則虛擬鍵盤上的searchButton不起作用。

+0

嘿,因爲這不是原始問題的答案,如果您將此作爲對您所指的答案的評論,將其做得更好,以使事情更清楚。 – ChristianM 2015-06-10 20:12:40

0

searchable.xml中的提示和標籤是引用,而不是硬編碼的字符串。

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

該如何它包含了搜索查看插件的活動應在清單

<activity 
    android:name="ACTIVITY PATH WHICH CONTAINS SEARCHVIEW WIDGET"> 

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

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

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

</activity> 
0

我在與SearchView麻煩不啓動SearchActivity,它原來是一個封裝/目錄問題。

如果SearchableActivity不位於同一目錄中Activity託管您SearchView,您需要更改:

searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchableActivity.class)));