在动作条无法获取搜索查看工作(Cannot get searchview in actionbar

2019-06-17 13:57发布

我非常新的Java和Android的发展; 我一直在努力中,我希望有一个操作栏的应用程序SearchView 。 我已经看了看谷歌的例子,但我不能得到它的工作。 我必须做一些错误的,我快要放弃的应用程序开发:DI已经搜查,但我没有发现任何有用的。 也许你们能帮助我:)

问题 :我得到的搜索视图中打开,因为它应该,但什么也没有发生在所有后,我发现我的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);
    }
}

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

源代码

Answer 1:

你的问题是在你的AndroidManifest。 我有它几乎完全为你做什么,因为这是我得到的文档以下。 但目前还不清楚或错误。

看着在API演示源我发现了“android.app.searchable”元数据必须在你的“结果”活动去,并在主要活动(或您放置搜索查看活动),你点到另一个具有“ 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提示和标签的参考,而不是硬编码字符串。

我希望它可以解决你的问题。 我花了一整天的数字出来:(



Answer 2:

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


Answer 3:

此外,它似乎,无论是安卓提示和android:标签属性, 则必须在strings.xml中的字符串引用。 懒惰和硬编码字符串值似乎并没有在所有的工作:)

即不要做:

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


Answer 4:

如果您使用的是Android工作室,

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


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


Answer 6:

这事实上是没有必要使用“缺失的部分”在上面的答案中描述。 这种方法(使用SearchView )工程完全按照官方文件说,直到使用搜索小工具 。 这里稍微修改需要做出如下:

在属性SearchableInfo用于显示标签,提示,建议,下水搜索结果屏幕和控制的其它启示,诸如语音按钮(创建意图的文档 )。

因此, SearchableInfo对象,我们传递给SearchView.setSearchableInfo(SearchableInfo s)必须包含应显示在搜索结果目标活动适当引用。 这是通过手工传递完成的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构造。



Answer 7:

确保您的searchables.xml文件是在正确的位置(即,在您的res/xml/文件夹)和相同的文件不包含任何错误-否则,你会发现, (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName)将返回null,破坏你的搜索功能。

(另外,确保设置componentName以适当的方式,因为在Android指南中所示的例子仅是为了当你正在搜索并以相同的活动显示的搜索。)



Answer 8:

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

例如

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


文章来源: Cannot get searchview in actionbar to work