无法在actionbar中获取searchview

Jon*_*son 66 android android-actionbar searchview

我是java和android开发的新手; 我一直在开发一个应用程序,我需要一个带有操作栏的操作栏SearchView.我看过谷歌的例子,但我无法让它工作.我一定做错了,我即将放弃应用程序开发:DI已经搜索但我没有找到任何有用的东西.也许你们可以帮助我:)

问题:我得到的搜索视图应该打开,但在此之后什么也没发生,我注意到我的searchManager.getSearchableInfo(getComponentName())返回null.另外,我给出的提示没有显示在我的搜索框中,这让我相信应用程序可能无法找到我的搜索文件?够了:)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是引用项目的链接,如果有人帮我这个,我将永远感激不尽!

源代码

Slo*_*loy 148

您的问题出在您的AndroidManifest中.我几乎和你一样,因为这是我得到的文件.但它不清楚或错误.

观察API演示源我发现"android.app.searchable"元数据必须进入"结果"活动,并且在主要活动(或放置SearchView的活动)中,您指向另一个" android.app.default_searchable".

您可以在以下文件中看到它,这是我的测试项目中的Manifest:

<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>
Run Code Online (Sandbox Code Playgroud)

同样重要的是,searchable.xml中的提示和标签是引用,而不是硬编码字符串.

我希望它能解决你的问题.我花了一整天才弄明白:(

  • 这篇文章刚刚救了我们 - 缺少的部分是`<meta-data android:name ="android.app.default_searchable"android:value =".SearchActivity"/>` (6认同)
  • _同样重要的是,searchable.xml中的提示和标签是引用,而不是硬编码的字符串._ ..解决了我的问题.这是非常荒谬的bug. (6认同)
  • 它完全奏效了!所以这不仅仅是我,我想:)我现在是一个快乐的露营者,谢谢Sloy!:) (5认同)
  • 我遇到了同样的问题并想出了该怎么做.由于官方文件有几个错误,我花了比预期更长的时间.已经在StackOverflow中多次询问过 - 我发现至少有5个帖子提出同样的问题.我将它们标记为与此重复.我[写了一篇博客](http://clint.logdown.com/posts/208273-android-unnecessarily-hard-to-get-started)总结了我学到的东西.希望能帮助到你. (3认同)

bak*_*kua 82

Android指南明确指出:

// Assumes current activity is the searchable activity
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这是不正确的.因为您不想在MainActivity中搜索,而是在SearchableActivity中搜索.这意味着您应该使用此ComponentName而不是getComponentName()方法:

ComponentName cn = new ComponentName(this, SearchableActivity.class);
searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));
Run Code Online (Sandbox Code Playgroud)


NPi*_*ike 13

此外,似乎android:hint和android:label属性必须引用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>
Run Code Online (Sandbox Code Playgroud)

但绝对做(正如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>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个错误还是这个特定的技术限制?对我来说,它似乎是一个错误(文档中没有提到你不能使用硬编码字符串). (4认同)
  • 谢谢你 我浪费了两天才弄清楚这一点。 (2认同)

tog*_*kan 7

如果您使用的是Android Studio,

<meta-data
            android:name="android.app.default_searchable"
            android:value=".SearchActivity" />
Run Code Online (Sandbox Code Playgroud)

部分可能无法正常工作

写完整的包名就像

<meta-data
                android:name="android.app.default_searchable"
                android:value="com.example.test.SearchActivity" />
Run Code Online (Sandbox Code Playgroud)


小智 6

小心"xml/searchable.xml".如果你用android:hint和制作硬代码android: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"/>
Run Code Online (Sandbox Code Playgroud)