2013-03-26 12 views
11

Ich versuche, meine erste Android-App zu erstellen und dabei SEARCH-Funktionalität hinzuzufügen. Ich habe die Android-Entwicklerdokumentation verfolgt, um sowohl den Suchdialog als auch das Widget hinzuzufügen. Wenn ich eine Suche durchführe, werden leider die "onCreate" UND die "onNewIntent" der Suchaktivität aufgerufen. Das heißt, indem Sie etwas in das Suchfeld der Aktionsleiste eingeben und ENTER drücken, wird die Suche TWICE genannt. Ich stecke fest. Soll eine globale Flagge von der Durchsuchbaren Aktivität zurückgegeben werden, die der App mitteilt, dass die Suche abgeschlossen wurde? Sind sowohl der Suchdialog als auch das Widget aufgerufen?Durchsuchbare Aktivität, die zweimal aufgerufen wird

Ich habe vorherige Beiträge auf dieser Website und im Internet vergeblich gesucht. Danke für jede Hilfe.

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

Hallo, haben Sie dieses Problem gelöst? Ich stehe vor der gleichen Sache – vinnybad

+0

Mit dem gleichen Problem. Hast du eine Lösung gefunden? –

+0

Leute, können Sie mir sagen, auf welchem ​​Gerät Sie dieses Problem gefunden haben? Ich kann es nur auf Genymotion-Emulator aber nicht auf jedem anderen Gerät reproduzieren (S3, S4, Galaxy Nexus mit 4.0.4, Nexus 7 mit 4.3) –

Antwort

2

Try super.OnNewIntent (Vorsatz) in Ihrem SearchableActivity zu entfernen.

Nach Ihrem Manifest Sie versuchen Dialog Sie verwenden

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

und in der gleichen Zeit zu nutzen suchen Suche in Ihrem Menü. Wenn Sie Suchen Sie

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

wie in http://developer.android.com/guide/topics/search/searchable-config.html verwenden sollten.

Das ist mein Beispiel xml/searchable.xml ist:

<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

Ich denke, Methoden onNewIntent und onCreate sich gegenseitig aus. Sie setzen launchMode auf "singleTop", so dass die Methode onNewIntent aufgerufen wird und nicht onCreate.

Ich habe ein ähnliches Problem, wenn eine Suchanfrage zweimal bearbeitet wird. Beim Arbeiten mit dem Beispiel "SearchableDictionary" im WXGA 10.1-Tablet-Emulator habe ich festgestellt, dass der erste Suchaufruf einwandfrei funktioniert, aber Folgeaufrufe erstellen zwei SEARCH-Ereignisse, sodass sie zweimal verarbeitet werden. Jemand erwähnte einen Fehler in Ti. (http://developer.appcelerator.com/question/127166/android-search-keyboardtype-fires-return-event-twice)

Ich testete Anwendungen auf einem echten Samsung-Tablet und ich sah zwei SEARCH-Ereignisse nicht, also denke ich, es ist ein Emulator-Problem, kein Code-Problem.

+0

Alter, du hast mir das Leben gerettet>: D < –

+0

Das Problem besteht nach 3 Jahren noch immer ... eine Stunde lang habe ich versucht, den Code zu debuggen :-( – henry000

Verwandte Themen