SearchView:getSearchableInfo返回null

时间:2014-01-30 10:20:34

标签: android xml android-manifest searchview searchable

我正在尝试在我的Android应用中实现搜索。有两个活动,即启动搜索的MainActivity(通过操作栏中的searchview)和ResultsActivity,其中处理搜索并使用结果对列表进行膨胀。问题是我在主活动中的onCreateOptionsMenu中调用的getSearchableInfo方法返回null,就像没有附加到活动的searchable.xml一样。我在清单中尝试了很多元数据安排的组合,也找到了互联网上的每个解决方案和其他stackoverflow问题,但似乎没有任何效果。 这些是来源:

的AndroidManifest.xml

 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light" >

    <activity
        android:name="com.example.webparser.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.searchable"
            android:resource="@xml/searchable" />

    </activity>


    <activity android:name="com.example.ResultsActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>


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

</application>

** MainActivity.java **

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    SearchManager searchManager = (SearchManager)  getSystemService(getApplicationContext().SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    Log.d("Search:", searchManager.getSearchableInfo(getComponentName())
            .toString());
    return true;
}

** ResultsActivity.java **

private void handleIntent(Intent intent) {

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        elementi = new ArrayList<String>();
        for(Ricetta ricetta:ricette){
            if( ricetta.getNome().toLowerCase().matches(query) ){
                elementi.add(ricetta.getNome());
            }
        }


        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                elementi);
        lista.setAdapter(adapter);
        Log.i("LOG:", "searching");
    }
}

** searchable.xml **

<?xml version="1.0" encoding="utf-8"?>

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

请注意我插入了一个Log.d,其中searchview应该被初始化,并且在哪里被称为getSearchableInfo,因此在运行时会引发nullpointerexception并且应用程序不会启动,但是如果删除了该Log.d然后除了搜索工作之外的所有事情(按下在搜索框中输入没有任何反应)。我认为清单存在问题,但我无法弄清楚它是什么。有没有人有任何线索? 我还尝试在singleTop中启动主要活动,将可搜索的元数据标记指向主要活动,但引发了同样的异常。

3 个答案:

答案 0 :(得分:0)

我注意到您正在使用“菜单”尝试获取搜索视图,而不是findViewById函数

SearchView searchView = (SearchView) menu.findItem(R.id.search)
        .getActionView()

应该更像这样

SearchView searchView = (SearchView) findViewById(R.id.search);

这将为您提供您正在寻找的 SearchView

答案 1 :(得分:0)

面临同样的问题。以下帮助我:

  • 这是我的MainActivity

    public boolean onCreateOptionsMenu(Menu menu) {       
      getMenuInflater().inflate(R.menu.menu_list_view_test, menu);
      SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
      MenuItem searchItem = menu.findItem(R.id.search);
      SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
      searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()) );
    return true;
    

注意:确保已从Support.v7.widget导入SearchView (import android.support.v7.widget.SearchView;)

  • 这是我的MainActivity的Menu.xml

    &LT; item android:id =“@ + id / search”     机器人:标题=“搜索”     机器人:图标= “@绘制/ ic_action_search”     应用:showAsAction = “ifRoom | collapseActionView”     app:actionViewClass =“android.support.v7.widget.SearchView”/&gt;

答案 2 :(得分:0)

在我的情况下,我有类似的设置只是有点不同。我有:

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

在我的主要活动中。并且

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

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

应该有用。

在我的ResultActivity中

。 我在MainActivity中创建了一个组件名称:

ComponentName componentName = new ComponentName(context, ResultActivity.class);

注意:请注意您的项目布局:

如果您对app:actionViewClass="android.support.v7.widget.SearchView"

有疑问,请使用:android:actionViewClass="android.support.v7.widget.SearchView"