java - studio - porque no puedo buscar en google desde mi celular
Tengo problemas para que la interfaz de búsqueda de Android funcione en la barra de acción (4)
Intenté seguir la guía aquí , pero estoy teniendo algunos problemas. Obtuve correctamente el icono de búsqueda para que aparezca en la barra de acciones, pero estoy teniendo problemas para adjuntar la searchable configuration
a 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 obstante, creo que esto no debería hacer la 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 obtengo esa información que 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 necesita o no, pero debajo está mi clase de SearchActivity. En este momento, no hace más que tratar de 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, The component name is ComponentInfo(com.stfi/com.stfi.StartingToFeelIt)
y no solo com.stfi.StartingToFeelIt. Esto me lleva a creer que algo está mal con mi archivo AndroidManifest, pero no tengo idea 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);
}
}
}
<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 de 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
He estado husmeando y he encontrado dos cosas que debes 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, debe 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 para ''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 usar ABS CollapsibleSearchMenu Lib.
"Mi archivo res / xml / searchable.xml (Nota: tuve que crear una carpeta" xml "en la carpeta res porque no existía. Sin embargo, creo que esto no debería hacer la diferencia".
Puede agregar carpetas cuando lo necesite, siempre y cuando siga las pautas de los espacios de nombres de xmls
Con respecto a la búsqueda, no creo que el minSdkVersion y targetSdkVersion tengan razón.
De acuerdo con el artículo compatible con Android que queda atrás , deberías estar usando
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />
<application>
...