21

アクションバーで検索ビューを設定できません。

開発者サイトをフォローしましたが、動作しません。何かが足りないような気がします。

コードを実行すると、常に「検索可能な情報を取得できませんでした」(MainActivity.setupSearchView())が出力されます。

MainActivity.java

// package...
// imports...
public class MainActivity extends Activity {
    private static String tag = "Main Activity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater mi = getMenuInflater();
        mi.inflate(R.menu.search_view, menu);
        setupSearchView(menu);
        return true;
    }
    private void setupSearchView(Menu menu) {
        SearchManager sm = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchableInfo si = sm.getSearchableInfo(getComponentName());
        if (si == null) {
            Log.wtf(tag, "failed to get searchable info");
            return;
        }
        SearchView sv = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        sv.setSearchableInfo(si);
        // Do not iconify the widget; expand it by default
        sv.setIconifiedByDefault(false);
    }
}

SearchResultsActivity.java

// package...
// imports...
public class SearchResultsActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Intent queryIntent = getIntent();
        doSearchQuery(queryIntent);
    }
    @Override
    public void onNewIntent(final Intent newIntent) {
        super.onNewIntent(newIntent);
        final Intent queryIntent = getIntent();
        doSearchQuery(queryIntent);
    }
}

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

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kpaek.examples"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="15" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".search.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SearchResultsActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
    </application>
</manifest>
4

7 に答える 7

43

私が見つけた重要なことは、searchable.xmlにはリテラル文字列を含めることはできず、リソースのみを含める必要があるということです。getSearchableInfoがサイレントに失敗するため、その1つで約半日を無駄にしました。

于 2012-04-20T15:15:00.053 に答える
19

私の場合、カスタムタグを使用するとres/menu/mymenu.xmlうまくいきました:

app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"

使ってはいけません:

android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.support.v7.widget.SearchView"
于 2014-08-28T12:15:13.693 に答える
18

getSearchableInfo(getComponentName())メソッドが正しい構成を返すには、検索が開始されるマニフェストアクティビティ要素(MainActivityにSearchViewがある)にintent -filter要素とmeta-data要素を含める必要があることがわかりました。ヌル。

<activity
    android:name=".MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

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

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

代わりに(そして今のところ私が使用しているソリューション)、結果アクティビティ宣言にインテントとメタデータを残し、引数をgetSearchableInfo()に次のように変更する必要があるのではないかと思います。

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

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

そして、MainActivityへの変更(searchableInfoの割り当てステートメントに注意してください):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_search, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView mySearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(getApplicationContext(), SearchResultsActivity.class));
    mySearchView.setSearchableInfo(searchableInfo);

    return true;
}
于 2015-05-04T14:47:02.390 に答える
11

これは私を1日殺しました-私はそれがActionBarSherlockに関連していると思いました、しかしそれはそれでうまくいきません。

問題は、サンプルを短絡させようとしていたことでした。少なくとも1つのアクティビティ(検索を実行しているアクティビティで十分です)には、マニフェストに次のインテントフィルターが含まれている必要があります。

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

そうでない場合は、searchManager.getSearchableInfo(getComponentName())常にnullを返し、構成は無視されます。

于 2013-03-08T18:09:34.370 に答える
3

開発者から:

検索可能な構成は、SearchViewの動作を定義し、res / xml/searchable.xmlファイルで定義されます。少なくとも、検索可能な構成には、Androidマニフェストのor要素のandroid:label属性と同じ値を持つandroid:label属性が含まれている必要があります。

例として、次のように表示されます。

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

app_nameは、マニフェストと同様に、アクティビティのラベルです。ただし、検索可能では、ラベルはsearch_labelを参照します。app_nameとsearch_labelが等しい場合はおそらく機能しますが、それは私には壊れやすいようです。

于 2012-09-13T16:35:42.183 に答える
2

この問題が発生しましたが、上記のアドバイスでは解決しませんでした。代わりに、SearchResultActivityでカテゴリのデフォルトを設定していることが判明しました。たとえば、次のブレークがあります。

<activity android:name=".SearchResultActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
    <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
            <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
</activity>

android.intent.category.DEFAULTを削除すると、この問題が解決します。

<activity android:name=".SearchResultActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
    <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
</activity>

また、この質問に対する以前の回答にはエラーがあります。MainActivityはandroid.app.default_searchableで定義する必要があります。 android.app.searchableは、SearchResultsActivity専用です。

<activity
    android:name=".MainActivity"
    android:label="@string/app_name">
    <!-- other stuff-->
    <meta-data android:name="android.app.default_searchable"
            android:value=".SearchResultsActivity" />
</activity>

結論として、SearchManagerは、AndroidManifest.xmlが完全でない場合に、サイレント障害が発生しやすい脆弱なコンポーネントです。

于 2015-12-18T20:02:43.713 に答える
1

上記のすべての解決策を確認したので、これで8時間も無駄にしましたが、1つ欠けていました。

私のAndroidマニフェストでは:

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

すべきだった:

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

私にとって、それは黙って失敗していました。最初に行う最善のことは、例をコピーして貼り付けることです。すべての属性が完全に同じであることを確認してください。

于 2016-05-01T14:49:06.547 に答える