No se puede hacer que la vista de búsqueda en la barra de acciones funcione

Soy bastante nuevo en el desarrollo de Java y Android; y he estado trabajando en una aplicación en la que quiero una barra de acción con un SearchView . He visto los ejemplos de google pero no puedo hacer que funcione. Debo estar haciendo algo mal y estoy a punto de renunciar al desarrollo de aplicaciones: DI ha buscado pero no he encontrado nada útil. Quizás ustedes puedan ayudarme 🙂

El problema : hago que la vista de búsqueda se abra como debería, pero después de eso no ocurre nada, he notado que mi searchManager.getSearchableInfo (getComponentName ()) devuelve null. Además, mi sugerencia que he dado no se muestra en mi cuadro de búsqueda, lo que me lleva a creer que tal vez la aplicación no pueda encontrar mi searchable.xml. Suficiente conversación 🙂

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

searchable.xml

    

Androidmanifest

                  

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

Y aquí hay un enlace al proyecto referido, ¡estaría eternamente agradecido si alguien me ayudara con esto!

Código fuente

Tu problema está en tu AndroidManifest. Lo tenía casi exactamente como tú, porque eso es lo que obtengo al seguir la documentación. Pero no está claro o está equivocado.

Al observar el origen de las demostraciones de API, encontré que los metadatos “android.app.searchable” deben ir en su actividad de “resultados”, y en la actividad principal (o la actividad donde coloca el SearchView) apunta al otro con ” android.app.default_searchable “.

Puedes verlo en el siguiente archivo, que es el Manifiesto de mi proyecto de prueba:

                      

También es importante que la sugerencia y la etiqueta en searchable.xml sean referencias y no cadenas codificadas.

Espero que resuelva tu problema Me tomó todo el día resolverlo 🙁

Las guías de Android dicen explícitamente:

 // Assumes current activity is the searchable activity searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

Que en tu caso NO ES VERDAD. Porque no desea buscar en MainActivity sino en SearchableActivity. Eso significa que debe usar este ComponentName en lugar del método getComponentName ():

 ComponentName cn = new ComponentName(this, SearchableActivity.class); searchView.setSearchableInfo(searchManager.getSearchableInfo(cn)); 

También parece que tanto los atributos android: hint y android: label DEBEN ser referencias a strings en strings.xml. Ser perezoso y codificar los valores de cadena no parece funcionar en absoluto 🙂

es decir, no hacer:

    

Pero definitivamente sí (como OP lo hizo correctamente):

    

Si está utilizando Android Studio,

  

parte puede no funcionar.

escriba el nombre completo del paquete como

  

tenga cuidado con “xml / searchable.xml”. Si creó HARD CODE con android:hint y android:label . No funcionará. Haha debería ser:

  

En realidad, no es necesario usar la “parte faltante” como se describe en las respuestas anteriores. Este método (utilizando un SearchView ) funciona exactamente como dicen los documentos oficiales hasta Usar el widget Buscar . Aquí una ligera modificación debe hacerse de la siguiente manera:

Las propiedades en un SearchableInfo se utilizan para mostrar tags, consejos, sugerencias, crear bashs para abrir pantallas de resultados de búsqueda y controlar otras prestaciones, como un botón de voz ( documentos ).

Por lo tanto, el objeto SearchableInfo que pasamos a SearchView.setSearchableInfo(SearchableInfo s) debe contener referencias adecuadas a la actividad de destino que debe mostrarse para mostrar los resultados de búsqueda. Esto se hace pasando manualmente el ComponentName de nuestra actividad objective. Un constructor para crear un ComponentName es

 public ComponentName (String pkg, String cls) 

pkg y cls son nombres de paquetes y clases de la actividad objective que se lanzará para mostrar los resultados de búsqueda. Tenga en cuenta que:

pkg debe apuntar al nombre del paquete raíz de su proyecto y,

cls debe ser un nombre completamente calificado de la clase (es decir, todo el asunto)

p.ej:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); // Get the SearchView and set the searchable configuration String pkg = "com.example.musicapp" String cls = "com.example.musicapp.search.SearchActivity" ComponentName mycomponent = new ComponentName(pkg,cls); SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(mycomponent)); searchView.setIconifiedByDefault(false); //if using on actionbar return true; } 

Dependiendo de sus requisitos, eche un vistazo a los otros constructores de ComponentName .

Asegúrese de que su archivo searchables.xml esté en la ubicación correcta (es decir, en su carpeta res/xml/ ) y de que el mismo archivo no contenga ningún error; de lo contrario, encontrará que (SearchManager)getSystemService(Context.SEARCH_SERVICE).getSearchableInfo(componentName) devolverá nulo, rompiendo su funcionalidad de búsqueda.

(Además, asegúrese de establecer componentName de la manera adecuada, ya que el ejemplo que se muestra en la guía de Android es solo cuando realiza búsquedas y muestra búsquedas en la misma actividad).

Verifique si la entrada correspondiente (es decir, search_hint y app_label) está presente en values ​​/ strings.xml

p.ej

  FunApp Caps Off