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:
- ¿Cómo puedo anclar una imagen al centro dentro de una vista de imagen en una vista de desplazamiento, en Android?
- ¿Algún problema o problema significativo con la Biblioteca de Databinding de Android?
- Android gms: play-services: 8.1.0 DexIndexOverflowException
- Al hacer clic en la notificación no se abre la actividad mencionada
- Cómo utilizar el widget de NumberPicker Android 4.0
<?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); } } }
- Cómo detectar si es el botón Recents, el modo Multi Window o el botón home onUserLeaveHint ()
- Contenedor personalizado para Android (hexagonal) con adaptador
- Glide Extracción de imágenes
- Utilice el método de clase T extendiendo ArrayList <T>
- ¿Cómo implementar una pantalla de bienvenida con una barra de progreso? androide
- Deserialize / unmarshal lista genérica de XML a la lista en Android
- Listview items Animación Parar mientras se desplaza
- Android buena arquitectura
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
- Notificaciones de la base de datos SQLite de Android
- ¿Cómo mostrar el símbolo registrado Ⓡ o marca registrada ™ en el diálogo?