web-dev-qa-db-ja.com

アクションバー内の検索ウィジェットのヒントが表示されない

アクションバー内に検索ウィジェットがあります。 Android:hint値を設定しましたが、検索アイコンをクリックしても表示されません。

関連ファイル:

MainActivity.Java

 package com.example.myApp;

import Android.os.Bundle;
import Android.app.ActionBar;
import Android.app.Activity;
import Android.app.SearchManager;
import Android.content.Context;
import Android.view.Menu;
import Android.widget.SearchView;

public class MainActivity extends Activity {

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

    //creates an action bar. 
    ActionBar actionBar = getActionBar();
    //sets the homebutton. 
    actionBar.setDisplayHomeAsUpEnabled(true);
}


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

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    return true;
  }   
}

Main.xml => res/menu/Main.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">


    <item Android:id="@+id/search"
          Android:title="@string/search_title"
          Android:icon="@drawable/ic_search"
          Android:showAsAction="collapseActionView|ifRoom"
          Android:actionViewClass="Android.widget.SearchView"       
          />
</menu>

searchable.xml => res/XML/searchable.XMl

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

    <searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:label="@string/app_name"
        Android:hint="search"
        Android:textColorHint= "#FF0000"      
    />  

Mainfest.XMl

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.MyApp"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="11"
        Android:targetSdkVersion="17" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="com.example.MyApp.MainActivity"
            Android:label="@string/app_name" >

             <meta-data Android:name="Android.app.searchable"
            Android:resource="@xml/searchable" />
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

私の試み:

アクションバーの背景が黒なので、ヒントテキストの色も黒なので、最初は:hint値が表示されないと思いました。ただし、hintTextColorを変更しても、ヒント値が表示されません。

何か案は?

ありがとう。

17
Rohan

何らかの理由で、タグ内に<action Android:name="Android.intent.action.SEARCH"/>を入れる必要があります。それが私にとって問題を解決したものです。ただし、この順序に注意してください

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

       <category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>

そうしないと、アクティビティがランチャーとして認識されません

23
Stanislav Bajt

まだ誰も私の質問に答えることができませんでした...

.Javaファイルでヒント値を変更する方法を見つけましたが、。xmlファイルでは変更していません。

_MainActivity.Java_のonCreateOptionsMenu(Menu menu)メソッド内で、次のことができます。

_searchView.setQueryHint("HINT TEXT...");
_

単純なEditTextのように、XMLでSearchWidgetのヒント値を事前設定できるはずだと思います。

18
Rohan

ヒント属性の文字列リソースを提供する必要があります。ハードコードされたテキストは機能しません。の代わりに

Android:hint="search"

文字列リソースを使用する

Android:hint="@string/search_hint"

ドキュメントはそれについて明確です: http://developer.Android.com/guide/topics/search/searchable-config.html

Android:hint="string resource"
14
Upvote

解決策にスキップしたい場合は、下にスクロールしてください

説明

これはSearchViewのバグのようです。

編集:私はこのバグを報告しました ここ 。編集2:将来のリリースで修正されるようです。 ここ を参照してください。

コンストラクターでは、フィールドmQueryHintに値を割り当てます。

public SearchView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    ...
    final CharSequence queryHint = a.getText(R.styleable.SearchView_queryHint);
    if (!TextUtils.isEmpty(queryHint)) {
        setQueryHint(queryHint);
    }
    ...
}

public void setQueryHint(CharSequence hint) {
    mQueryHint = hint;
    updateQueryHint();
}

後で、SearchableInfo(ヒントを読み取る必要のあるオブジェクト)を設定すると、次のようになります。

public void setSearchableInfo(SearchableInfo searchable) {
    mSearchable = searchable;
    if (mSearchable != null) {
        ...
        updateQueryHint();
    }
    ...
}

今まではすべて大丈夫のようです。 searchableInfomSearchableというフィールドに保存します。 updateQueryHintの機能を見てみましょう。

private void updateQueryHint() {
    if (mQueryHint != null) {
        mSearchSrcTextView.setHint(getDecoratedHint(mQueryHint));
    } else if (IS_AT_LEAST_FROYO && mSearchable != null) {
        CharSequence hint = null;
        int hintId = mSearchable.getHintId();
        if (hintId != 0) {
            hint = getContext().getString(hintId);
        }
        if (hint != null) {
            mSearchSrcTextView.setHint(getDecoratedHint(hint));
        }
    } else {
        mSearchSrcTextView.setHint(getDecoratedHint(""));
    }
}

何?したがって、mQueryHintにすでに値がある場合、検索可能な情報を読み取ることすらできませんか? mQueryHintがSearchViewコンストラクターのデフォルト値に割り当てられているため(上​​記を参照)、ヒントが表示されないのはこのためです。

解決

では、このバグをどのように回避するのでしょうか。

2つのオプション:

  1. 新しい値でsetQueryHintを使用します。

例:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your_menu, menu);

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(this);
    // Assumes current activity is the searchable activity
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(getComponentName());
    searchView.setSearchableInfo(searchableInfo);

    // Override the hint with whatever you like
    searchView.setQueryHint(getResources().getString(R.strings.your_hint));

    return true;
}
  1. SearchableInfoを設定する前に、nullを指定してsetQueryHintを使用してください

例:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your_menu, menu);

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(this);
    // Assumes current activity is the searchable activity
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(getComponentName());

    // DO THIS BEFORE setSearchableInfo !!!
    searchView.setQueryHint(null);

    searchView.setSearchableInfo(searchableInfo);

    return true;
}

どちらもappcompatv7での動作を確認しました。

13
Moeri

使用できます

Android:queryHint="Hint text"

xMLの検索ウィジェットで。

2
Neha Nathani

受け入れられた回答は確かに機能しますが、MAINアクティビティに対してのみ機能します。別のアクティビティで使用したい場合は機能しません。

以下のコードは Android開発者サイト から取られています

<activity
    Android:name="com.example.Activities.MainActivity"
    Android:label="@string/app_name">

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

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

</activity>
2
Marko