2013-03-26 8 views
11

Próbuję utworzyć moją pierwszą aplikację na Androida oraz w procesie dodawania jej funkcji WYSZUKAJ. Postępowałem zgodnie z dokumentacją programisty Androida, aby dodać zarówno okno dialogowe wyszukiwania, jak i widżet. Niestety, za każdym razem, gdy wykonuję wyszukiwanie, wywoływane jest "onCreate" I "onNewIntent" aktywności wyszukiwania. Oznacza to, że wpisując coś w polu wyszukiwania paska akcji i wciskając klawisz ENTER, wyszukiwanie ma wartość DWUKROTNIE. Utknąłem. Czy jakaś flaga globalna ma zostać zwrócona z działania Przeszukiwalny powiadamiającego aplikację, że wyszukiwanie zostało zakończone? Czy BOTH jest wywoływane w oknie dialogowym wyszukiwania i widżecie?Przeszukiwana aktywność jest wywoływana dwukrotnie

Wyszukiwanie poprzednich wpisów na tej stronie i w Internecie bez skutku. Dziękuję za pomoc.

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

Witaj, czy rozwiązałeś ten problem? Mam do czynienia z tym samym problemem. – vinnybad

+0

Wobec tego samego problemu. Znalazłeś rozwiązanie? –

+0

chłopaki, czy możesz mi powiedzieć, na jakim urządzeniu znalazłeś ten problem? Mogę go odtworzyć tylko na emulatorze Genymotion, ale nie na żadnym innym urządzeniu (S3, S4, Galaxy Nexus z 4.0.4, Nexus 7 z 4.3) –

Odpowiedz

2

spróbować usunąć super.OnNewIntent (intent) w SearchableActivity.

Według swoim manifeście próbujesz użyć wyszukiwania dialogowe

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

iw tym samym czasie można używać SearchView w menu. Jeśli używasz SearchView należy użyć

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

jak w http://developer.android.com/guide/topics/search/searchable-config.html.

To jest mój przykład 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

myślę metod onNewIntent i onCreate wykluczają się wzajemnie. Ustawiłeś launchMode na "singleTop", więc metoda onNewIntent zostanie wywołana, a nie onCreate.

Mam podobny problem, gdy jedno żądanie wyszukiwania jest przetwarzane dwukrotnie. Pracując z próbką SearchableDictionary w emulatorze tabletu WXGA 10.1 odkryłem, że pierwsze wywołanie wyszukiwania działa dobrze, ale kolejne wywołania tworzą dwa zdarzenia SEARCH, więc są przetwarzane dwa razy. Ktoś wspomniał o błędzie w Ti. (http://developer.appcelerator.com/question/127166/android-search-keyboardtype-fires-return-event-twice)

Testowałem aplikacje na prawdziwym tabletie Samsunga i nie widziałem dwóch zdarzeń SEARCH, więc domyślam się, że to problem emulatora, a nie problem z kodem.

+0

Stary, uratowałeś mi życie>: D < –

+0

Problem nadal istnieje po 3 latach ... stracił godzinę próbując debugować kod :-( – henry000

Powiązane problemy