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.
Tienes que proporcionar un recurso de cadena para el atributo de pista. El texto codificado no funcionará. En lugar de
android:hint="search"
usar un recurso de cadena
android:hint="@string/search_hint"
El documento lo tiene claro: http://developer.android.com/guide/topics/search/searchable-config.html
android:hint="string resource"
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:
- 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;
}
- 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.