2013-03-26 30 views
11

Sto provando a creare la mia prima app per Android e in procinto di aggiungervi la funzionalità di ricerca. Ho seguito la documentazione dello sviluppatore Android per aggiungere sia la finestra di dialogo Cerca che il widget. Sfortunatamente, ogni volta che eseguo una ricerca, vengono chiamati "onCreate" E "onNewIntent" dell'attività di ricerca. Cioè, digitando qualcosa nella casella Cerca nella barra delle azioni e premendo INVIO, la ricerca viene chiamata DUE VOLTE. Sono bloccato. Si suppone che venga restituita una bandiera globale dall'attività ricercabile che notifica all'app che la ricerca è stata completata? SONO ENTRAMBI i nomi della finestra di dialogo Cerca e del widget?L'attività ricercabile viene chiamata due volte

Ho cercato i post precedenti su questo sito e sul Web senza alcun risultato. Grazie per tutto l'aiuto.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.shop" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <service android:name="com.shop.RestIntentService" /> 

     <activity 
      android:name="com.shop.MainActivity" 
      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="com.shop.CatalogActivity" 
      android:label="@string/app_name" > 
     </activity> 

     <activity 
      android:name="com.shop.SearchableActivity" 
      android:launchMode="singleTop" > 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
      </intent-filter> 

      <!-- 
      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 
      </intent-filter> 
      --> 

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

     <meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.shop.SearchableActivity" /> 

    </application> 

</manifest> 

SearchableActivity.java

public class SearchableActivity extends ListActivity implements Receiver { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     System.out.println("onCreate"); 
     handleIntent(getIntent()); 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     System.out.println("onNewIntent"); 
     setIntent(intent); 
     handleIntent(intent); 
    } 

    private void handleIntent(Intent intent) { 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      doSearch(query); 
     } 
    } 

    private void doSearch(String queryStr) { 
     System.out.println("searching..." + queryStr); 
    } 

CatalogActivity.java

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.sample, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

     SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 

     searchView.setSearchableInfo(searchManager 
       .getSearchableInfo(getComponentName())); 

     //return super.onCreateOptionsMenu(menu); 
     return true; 
    } 

sample.xml

<item 
    android:id="@+id/menu_search" 
    android:actionViewClass="android.widget.SearchView" 
    android:icon="@android:drawable/ic_menu_search" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:title="@string/menu_search"/> 
+0

Ciao, hai risolto questo problema? Sto affrontando la stessa cosa – vinnybad

+0

di fronte allo stesso problema. Hai trovato una soluzione? –

+0

ragazzi, puoi dirmi su quale dispositivo hai trovato questo problema? Posso riprodurlo solo con l'emulatore Genymotion ma non su qualsiasi altro dispositivo (S3, S4, Galaxy Nexus con 4.0.4, Nexus 7 con 4.3) –

risposta

2

tenta di rimuovere super.OnNewIntent (intenzione) nella tua SearchableActivity.

Secondo il vostro manifesto si sta tentando di utilizzare la ricerca di dialogo

<meta-data 
android:name="android.app.default_searchable" 
android:value="com.shop.SearchableActivity" /> 

e nello stesso tempo si utilizza SearchView nel vostro menu. Se si utilizza SearchView si dovrebbe usare

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

come in http://developer.android.com/guide/topics/search/searchable-config.html.

Questo è il mio esempio di XML/searchable.xml:

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_name" 
    android:hint="@string/search" 
    android:searchSuggestAuthority="@string/authority" 
    android:searchSuggestSelection=" ?" 
    android:voiceSearchMode="launchRecognizer"> 
</searchable> 
9

penso metodi onNewIntent e onCreate si escludono a vicenda. Impostate launchMode su "singleTop", quindi verrà chiamato il metodo onNewIntent e non onCreate.

Ho un problema simile quando una richiesta di ricerca viene elaborata due volte. Lavorando con il campione SearchableDictionary nell'emulatore di tablet WXGA 10.1 ho scoperto che la prima chiamata di ricerca funziona bene, ma le chiamate conseguenti creano due eventi di RICERCA, quindi vengono elaborati due volte. Qualcuno ha parlato di un insetto in Ti. (http://developer.appcelerator.com/question/127166/android-search-keyboardtype-fires-return-event-twice)

Ho provato le app su un vero tablet Samsung e non ho visto due eventi di RICERCA, quindi immagino sia un problema di emulazione, non un problema di codice.

+0

Amico, mi hai salvato la vita>: D < –

+0

Il problema esiste ancora dopo 3 anni dopo ... perso un'ora cercando di eseguire il debug del codice :-( – henry000

Problemi correlati