java android colors android-actionbar hint

java - Sugerencia en el widget de búsqueda dentro de la barra de acción no se muestra



android colors (6)

Tengo un widget de búsqueda dentro de una barra de acción. He configurado un valor de android: hint, sin embargo, no aparece cuando hago clic en el icono de búsqueda.

Archivos Relevantes :

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>

Mi intento :

Mi barra de acción tiene un fondo negro, así que asumí que inicialmente no podía ver el valor de la sugerencia, ya que el color del texto de la sugerencia también es negro. Sin embargo, incluso después de cambiar el hintTextColor, todavía no puedo ver el valor de la sugerencia.

¿Algunas ideas?

Gracias.


La respuesta aceptada sí funciona, pero solo para la actividad PRINCIPAL. Si desea utilizarlo en otra actividad, no funcionará.

El siguiente código está tomado del sitio de desarrolladores de 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>


Nadie ha podido responder mi pregunta todavía ...

He encontrado una manera de cambiar el valor de la sugerencia en el archivo .java pero no en el archivo .xml .

Dentro del onCreateOptionsMenu(Menu menu) de MainActivity.java , puedo hacer:

searchView.setQueryHint("HINT TEXT...");

Creo que todavía debería ser capaz de preestablecer un valor de sugerencia de un SearchWidget en XML como un simple EditText .


Por alguna razón, debe poner <action android:name="android.intent.action.SEARCH"/> dentro de su etiqueta. Eso es lo que me solucionó el problema. Pero ten cuidado de ponerlo en este orden.

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

De lo contrario su actividad no será reconocida como lanzador.


Puedes usar

android:queryHint="Hint text"

en su Widget de búsqueda en XML.



Si desea saltar a la solución, simplemente desplácese hacia abajo

Explicación

Parece que esto sería un error en SearchView .

Edit: he informado de este error here . Edición 2: parece estar arreglado para un lanzamiento futuro, vea here .

En el constructor, asigna un valor al campo 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(); }

Más tarde, cuando configura SearchableInfo (ya sabe, el objeto del que debería leer la sugerencia), sucede lo siguiente:

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

Todo parece estar bien hasta ahora. Guarda el searchableInfo en un campo llamado mSearchable . Veamos lo que hace 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("")); } }

¿Qué? Entonces, si mQueryHint ya tiene un valor, ¿ni siquiera leemos la información de búsqueda? Eso explica por qué nunca vemos nuestra sugerencia, porque mQueryHint se asigna a un valor predeterminado en el constructor SearchView (ver arriba).

Solución

Entonces, ¿cómo podemos solucionar este error?

Dos opciones:

  1. Utilice setQueryHint con el nuevo valor.

Ejemplo:

@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. Use setQueryHint con null ANTES de configurar SearchableInfo

Ejemplo:

@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; }

Ambos confirmaron trabajar con appcompat v7.