El widget de la barra de búsqueda no inicia actividad de búsqueda
Estoy intentando implementar una búsqueda en mi aplicación android usando un widget de barra de búsqueda en la barra de acción.
Estoy siguiendo
- Aplicación para Android Cómo retrasar el inicio del servicio en el inicio del teléfono
- SetOnItemClickListener en ListView que amplía la actividad
- ¿He usado Singleton con Realm Database correcto?
- ¿Por qué se omite esta instrucción if?
- Retrofit - android.os.NetworkOnMainThreadException
Http://developer.android.com/guide/topics/search/search-dialog.html http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Tutoriales para hacer esto.
Tengo dos actividades involucradas en la búsqueda. La actividad SearchBar tiene la barra de acción y AcceptSearch es mi actividad de búsqueda. Aunque declaré qué actividad era la actividad de búsqueda, la consulta no se envía a AcceptSearch y la actividad no se inicia.
Configuré la barra de búsqueda de tal manera que una sugerencia de la barra de búsqueda aparece cuando el widget está vacío, pero la sugerencia tampoco aparece nunca. Aquí está mi código.
Barra de búsqueda
public class SearchBar extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.search_bar); } @Override public boolean onCreateOptionsMenu(Menu menu) { //Inflate the options menu from XML MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, 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())); searchView.setIconifiedByDefault(false); return true; }
AceptarBúsqueda
public class AcceptSearch extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash_screen); //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); //Start the search doMySearch(); } }
Searchable.xml
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint"> </searchable>
Opciones_menu
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:title="Help" android:id="@+id/menu_help" android:showAsAction="always" /> <item android:title="Categories" android:id="@+id/menu_cats" android:showAsAction="always" /> <item android:id="@+id/menu_search" android:title="Search with Searchlet" android:icon="@drawable/ic_action_search" android:showAsAction="ifRoom|collapseActionView" android:actionViewClass="android.widget.SearchView"/> </menu>
Manifiesto
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.searchlet" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".SplashScreenActivity" android:label="@string/title_activity_splash_screen" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".AcceptSearch"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> <activity android:name=".SearchBar" android:label="@string/app_name"> <intent-filter> <action android:name="com.example.searchlet.CLEARSCREEN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
Creo que es toda la información necesaria para recrear la situación.
Gracias a todos de antemano. Aprecio
- Android Studio: ¿Cómo excluir el módulo google-services en el sabor del producto?
- Cómo analizar un JSONArray de JSONObjects en JAVA?
- Cambiar la intensidad de clarear / oscurecer en mapas de bits mediante PorterDuffXfermode en la clase Paint de Android
- Java.lang.RuntimeException: Paralleable encontró IOException escribiendo objeto serializable en Android que pasa el objeto ArrayList
- ¿Qué lenguajes de programación puedo usar en Android Dalvik?
- Android: Administración de varias notificaciones
- Depurando ExpandableListView de la base de datos - no funciona
- BadTokenException: No se puede agregar la ventana
Tuve un problema similar. Estaba siguiendo el tutorial de Grokking y la actividad nunca se abrió. Intenté las soluciones de Indrek que funcionan para mí.
Debe asegurarse de que tiene los metadatos correctos bajo el padre correcto. Los metadatos
<meta-data android:name="android.app.default_searchable" android:value=".NameSearchActivity" />
Debe estar bajo la aplicación. Los siguientes metadatos
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
Debe estar bajo el parámetro de actividad de búsqueda dentro de AndroidManifest.xml.
En la actividad de búsqueda hice lo que decía en el tutorial vinculado antes para gestionar la pila de actividades. Espero que esta solución funcione para todos con el mismo problema.
Los tutoriales parecen faltar una parte importante. Tienes que agregar <meta-data android:name="android.app.default_searchable" android:value=".MySearchActivityName" />
dentro de las etiquetas <application>
.
Pau Arlandis Martínez, gracias. Su solución funciona bien y tutorial con pila de actividades es útil. Puse en la sección <application>
este metadato:
<meta-data android:name="android.app.default_searchable" android:value=".NameSearchActivity" />
Y me di cuenta de que el método @Override onQueryTextSubmit debe devolver false para iniciar la actividad de búsqueda. De lo contrario searchButton en el teclado virtual no funciona.
Te faltan los metadatos en el archivo '.SearchBar' Actividad del manifiesto, que dirige a la actividad '.AcceptSearch'.
Agregue los siguientes metadatos a la actividad ".SearchBar":
<!-- search widget target activity--> <meta-data android:name="android.app.default_searchable" android:value=".AcceptSearch" />
Aquí se actualiza el código del manifiesto de actividad '.SearchBar'.
<activity android:name=".SearchBar" android:label="@string/app_name"> <!-- search widget target activity--> <meta-data android:name="android.app.default_searchable" android:value=".AcceptSearch" /> <intent-filter> <action android:name="com.example.searchlet.CLEARSCREEN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
La sugerencia y la etiqueta en searchable.xml son referencias y no cadenas codificadas.
<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search_hint" android:label="@string/app_name"/>
De este modo se debe declarar la actividad que contiene el widget SearchView en el manifiesto
<activity android:name="ACTIVITY PATH WHICH CONTAINS SEARCHVIEW WIDGET"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> </activity>
Declaración para la actividad de búsqueda en el manifiesto.
<activity android:name=".SearchableActivity"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
- ¿Cómo agregar datos al calendario de Google mediante programación en android?
- Parece que no tiene recursos de Facebook SDK cuando usa Facebook Android SDK en IntelliJ IDEA 12