Tengo problemas para que la interfaz de búsqueda de Android funcione en la barra de acciones

Intenté seguir la guía aquí , pero tengo algunos problemas. He conseguido correctamente el icono de búsqueda para que aparezca en la barra de acción, pero estoy teniendo problemas para adjuntar la searchable configuration al SearchView.

Mi archivo res / menu / options_menu.xml:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> </menu> 

Mi archivo res / xml / searchable.xml (Nota: Tuve que crear una carpeta "xml" en la carpeta res porque no existía. ¿No creo que esto deba hacer una diferencia?

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" /> 

Mi archivo res / values ​​/ strings.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Starting To Feel It</string> <string name="single_post">Single Post View</string> <string name="search">Search Activity</string> <string name="action_settings">Settings</string> <string name = "pagination_last">Last</string> <string name = "pagination_next">Next</string> <string name = "player_play">Play</string> <string name = "player_previous">Previous</string> <string name = "player_next">Next</string> <string name = "player_playlist">Playlist</string> <string name = "player_progress_bar">Progress Bar</string> <string name="drawer_open">Open navigation drawer</string> <string name="drawer_close">Close navigation drawer</string> <string name="search_title">Search STFI</string> <string name="search_hint">Search STFI</string> <string name="menu_item_picture">Menu Item Picture</string> </resources> 

Mi archivo AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.stfi" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:theme="@android:style/Theme.Holo.Light" > <activity android:name=".StartingToFeelIt" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.SinglePost" android:label="@string/single_post"> </activity> <activity android:name=".activities.SearchActivity" android:label="@string/search"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> </application> </manifest> 

Todas mis actividades extienden una clase que llamé MenuActivity , y aquí está la función onCreateOptionsMenu define en MenuActivity.java:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); // Associate searchable configuration with the SearchView SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); System.out.println("The component name is " + this.getComponentName().toString()); SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); if(info == null) { System.out.println("It is null!"); } searchView.setSearchableInfo(info); return true; } 

Siempre estoy recibiendo que la información es nula en esta función. No estoy seguro de lo que estoy haciendo mal para obtener información es nulo, y no estoy seguro de cómo solucionarlo. No estoy seguro si lo necesitas o no, pero a continuación está mi clase SearchActivity. En este momento no hace nada, pero intenta mostrar la búsqueda (sin embargo, nunca se llama porque la configuración de búsqueda no está configurada correctamente). El archivo se guarda en com.stfi.activities.SearchActivity.java.

Otra nota: Cuando The component name is ComponentInfo(com.stfi/com.stfi.StartingToFeelIt) el nombre del componente en la función anterior, obtengo The component name is ComponentInfo(com.stfi/com.stfi.StartingToFeelIt) y no sólo com.stfi.StartingToFeelIt. Esto me lleva a creer que algo está mal con mi archivo AndroidManifest, pero no tengo ni idea de si esta es la causa de por qué no puedo adjuntar la configuración de búsqueda.

 public class SearchActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); System.out.println("You are searchin " + query); } } } 

He beeen poking alrededor y han encontrado dos cosas que usted necesita hacer.

1. Actualice su Manifest.xml y use <meta para agregar su interfaz de búsqueda.

2. Para que tenga una configuración de búsqueda, necesita agregar metadatos

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

probablemente problema con el manifiesto supongo,

 <meta-data android:name="android.app.default_searchable" android:value=".SearchActivity" /> 

falta en la etiqueta de actividad de manifiesto de 'StartingToFeelIt'

  <activity android:name=".StartingToFeelIt" android:label="@string/title_activity_main" > <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=".SearchActivity" /> </activity> 

también puede utilizar ABS CollapsibleSearchMenu Lib.

"Mi archivo res / xml / searchable.xml (Nota: Tuve que crear una carpeta" xml "en la carpeta res porque no existía. ¿No creo que esto deba hacer una diferencia?

Puede agregar carpetas según sus necesidades, siempre y cuando siga las instrucciones de los namespaces de los xmls

Con respecto a la búsqueda, no creo que el minSdkVersion y targetSdkVersion son correctos.

De acuerdo con el artículo de Android, Remaining Backward Compatible que debe utilizar

 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> <application> ... 
  <activity android:name="com.yourapp.YourSearchActivity" android:label="@string/title_activity_search" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> 

En mi menú XML para la actividad:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.mirrorcamera.MainActivity" > <item android:id="@+id/search" android:showAsAction="always" android:title="@string/string_title"/> </menu> 

Código Java:

 public class SearchActivity extends ListActivity { private static final int ICON = R.drawable.ic_ab_back_holo_light; private SearchDataBaseAdapter searchDataBaseAdapter; private ArrayList<SearchResultModel> searchResultList; private ResultListAdapter resultListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); super.onCreate(savedInstanceState); searchResultList = new ArrayList<SearchResultModel>(); // gets the db reference from adapter searchDataBaseAdapter = new SearchDataBaseAdapter(this); searchDataBaseAdapter.open(); handleIntent(getIntent()); } /** * Handles the intent from the search. * * @param intent */ private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { // handles a search query String query = intent.getStringExtra(SearchManager.QUERY); search(query); } } @Override public void onNewIntent(Intent intent) { // super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search: onSearchRequested(); break; } return true; } /** * Search function. * * @param searchTerm */ public void search(String searchTerm) { try { Cursor cursor = searchDataBaseAdapter.getWordMatches(searchTerm, null); //create and add your list to your adapter. resultListAdapter = new ResultListAdapter(this, itemsFound(cursor, cursor.getString(cursor.getColumnIndex("YOUR_COLUMN")))); } catch (NullPointerException ex) { Toast.makeText(this, "Search Term not found", Toast.LENGTH_LONG).show(); ex.getStackTrace(); } setListAdapter(resultListAdapter); } /** * Returns the items found and writes the items found to an arraylist. * @return */ private ArrayList<SearchResultModel> itemsFound(Cursor cursor, String itemName, String itemDescription, int type) { // ArrayList<String> list = new ArrayList<String>(); if (cursor.moveToFirst()) { do { searchResultList.add(new SearchResultModel(itemName, itemDescription, type, ICON)); } while (cursor.moveToNext()); } cursor.close(); return searchResultList; } } 

Espero que esto ayude

  • Los complementos no funcionan en Eclipse en Windows 7 64 bits
  • Alinear el centro de texto con android
  • Android-Execution failed for task ': app: transformClassesWithDexForAvsDebug'
  • Spinner onItemSelected () se ejecuta cuando no se supone que
  • Android con comunicación websocket (servidor Node Websocket y Android Java Client). No funciona en Android 4
  • Android - Color de fondo de AlertDialog personalizado
  • Cómo depurar la aplicación de Android construida con maven
  • Android Paint: cómo obtener efecto "aerógrafo"?
  • RecyclerVista el espacio entre los elementos que se expanden al desplazarse
  • El estilo de Holo de DatePickerDialog falló en Android 7 Turrón
  • Android Authentication Mananger, ¿cuándo se requiere el permiso del usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.