2012-07-28 37 views
64

我对java和android开发很新颖;我一直在研究一个女巫的应用程序,我想要一个带有SearchView的操作栏。我看了谷歌的例子,但我不能得到它的工作。我一定在做错事,而我即将放弃应用程序开发:D我已经搜索过,但我没有找到任何有用的东西。也许你们能帮助我:)无法在操作栏中使用searchview来工作

问题:我得到的搜索视图中打开,因为它应该,但什么也没有发生在所有后,我发现我的searchManager.getSearchableInfo(getComponentName() )返回null。此外,我的提示并未显示在我的搜索框中,因此我相信应用程序可能无法找到我的searchable.xml文件?说得够多了:)

MainActivity.java

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, 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())); 

     return true; 
    } 
} 

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/app_label"> 
</searchable> 

Androidmanifest

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

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

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

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

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

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

    </application> 

</manifest> 

SearchableActivity.java

package com.example.searchapp; 

import android.app.ListActivity; 
import android.app.SearchManager; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

public class SearchableActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.search); 

     // 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); 
      doMySearch(query); 
     } 
    } 

    private void doMySearch(String query) { 
     Log.d("Event",query); 
    } 
} 

这里是在提到项目的链接,我会永远感激,如果有人是为了帮助我!

Source code

+0

menu.findItem(R.id.menu_search) - 这是怎么编译的?什么是R.id.menu_search? – 2013-05-02 13:51:28

+0

如何在搜索活动中继续搜索。如何在搜索活动中再次设置actionBar搜索视图以在同一活动中搜索更多内容。 – 2013-11-01 19:19:36

+0

我需要帮助http://stackoverflow.com/questions/32197791/how-to-access-searchview-in-fragment – 2015-08-26 06:03:05

回答

145

你的问题是在你的AndroidManifest。我几乎和你一样,因为这是我遵循文档。但不清楚或错误。

观看API演示源我发现“android.app.searchable”元数据必须放在“结果”活动中,并且在主活动(或放置SearchView的活动)中指向另一个是“android.app.default_searchable”。

你可以看到它在下面的文件,这是我的测试项目内容清单:

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

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

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <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.default_searchable" 
      android:value=".SearchActivity" /> 
    </activity> 
    <activity 
     android:name=".SearchActivity" 
     android:label="@string/app_name" > 

     <!-- This intent-filter identifies this activity as "searchable" --> 

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

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

     <!-- This metadata entry provides further configuration details for searches --> 
     <!-- that are handled by this activity. --> 

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

同样重要的是,在searchable.xml提示和标签的参考,而不是硬编码的字符串。

我希望它能解决您的问题。我花了整整一天的时间来弄清楚:(

+5

它完全工作!所以它不只是我然后我猜:)我现在是一个快乐的露营者,谢谢Sloy! :) – 2012-07-29 06:20:52

+6

这篇文章刚刚救了我们 - 缺少的部分是'元数据 android:name =“android.app.default_searchable” android:value =“。SearchActivity”/>' – 2012-12-01 20:15:00

+1

这是Android Dev文档目前还不清楚,这个答案让我无法执行大量的代码。谢谢! – jaibatrik 2013-03-30 18:17:12

13

此外,似乎android:hint和android:标签属性必须必须是strings.xml中的字符串引用。懒惰和硬编码字符串值doesn'吨似乎工作:)

ie不要做:

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:hint="Search for something..." 
    android:label="My App"> 
</searchable> 

但可以肯定做(如OP正确所做的那样):

<?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/app_label"> 
</searchable> 
+2

这是一个bug还是这是一些特定的技术限制?对我来说,这似乎是一个错误(在文档中没有提到你不能使用硬编码的字符串)。 – 2013-06-14 19:43:21

+1

谢谢你。在弄清楚这一点之前,我浪费了2天时间。 – lahsrah 2016-06-25 02:09:01

+1

哇5天后这工作。谢谢! – 2017-09-23 05:15:08

2

这事实上是没有必要使用“缺失的部分”在上面的答案中描述。此方法(使用SearchView)与官方文档中的说法完全相同,直到Using the Search widget。这里需要进行如下细微修改:

SearchableInfo中的属性用于显示标签,提示,建议,创建用于启动搜索结果屏幕和控制其他可供件(例如语音按钮(docs))的意图。

因此,我们传递给SearchView.setSearchableInfo(SearchableInfo s)SearchableInfo对象必须包含应显示的目标活动的适当引用以显示搜索结果。这是通过手动传递我们目标活动的ComponentName完成的。创建ComponentName一个构造函数是

public ComponentName (String pkg, String cls) 

pkgcls要推出显示搜索结果包名和目标活动的类名。需要注意的是:

pkg必须指向你的项目的根包名称,

cls必须是类的完全限定域名(即整个事情)

如:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    // Get the SearchView and set the searchable configuration 
String pkg = "com.example.musicapp" 
String cls = "com.example.musicapp.search.SearchActivity" 
ComponentName mycomponent = new ComponentName(pkg,cls);  
SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); 
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
searchView.setSearchableInfo(searchManager.getSearchableInfo(mycomponent)); 
searchView.setIconifiedByDefault(false); //if using on actionbar 
return true; 
} 

根据您的要求,看看其他ComponentName构造函数。

+0

没有用,但这:) :) – 2014-08-18 07:29:59

6

如果你使用过Android Studio,

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

部分可能无法正常工作。

写完整的包名状

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

不,这不应该是一个问题。我正在使用Android Studio(版本0.8.1),它可以很好地使用'.SearchActivity'。 – Clint 2014-07-03 22:18:58

+0

这解决了我的问题,用android studio 2.3.3和构建工具25.0.2 – sonic 2017-08-31 20:33:18

76

Android指南明确地说:

// Assumes current activity is the searchable activity 
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

这是你的情况不属实。因为您不想在MainActivity中搜索但在SearchableActivity中搜索。这意味着你应该使用这个组件名,而不是getComponentName()方法:

ComponentName cn = new ComponentName(this, SearchableActivity.class); 
searchView.setSearchableInfo(searchManager.getSearchableInfo(cn)); 
+1

终于解决了这个问题 – 2014-12-13 22:08:29

+0

很好。这需要花费数小时才能解决。谢谢 – 2015-01-15 20:29:42

+0

这对我来说非常合适。 – 2015-03-27 15:33:51

1

确保您searchables.xml文件是在正确的位置(即,在您的res/xml/文件夹中)和同一文件不包含任何错误 - 否则你会发现(SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName)将返回null,破坏你的搜索功能。 (另外,请确保以适当的方式设置componentName,因为Android指南中显示的示例仅适用于在同一活动中进行搜索和显示搜索时使用的示例。)

-1

仔细检查,如果相应的条目(即search_hint和app_label)存在于值/ strings.xml中

例如

 <string name="app_label">FunApp</string> 
     <string name="search_hint">Caps Off</string> 
+0

他实际上没有错,只是没有足够的解释,请参阅下面的解决方案。 – 2017-09-23 05:29:45

5

小心 “XML/searchable.xml”。 如果您制作硬编码为android:hintandroid:label。它不起作用。哈哈 应该是:

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:hint="@string/app_name" 
android:label="@string/search_lb" 
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/> 
+0

太奇怪了。这是一个错误? – 2017-09-23 05:29:06