2013-03-26 35 views
11

Tôi đang cố gắng tạo ứng dụng Android đầu tiên của mình và đang trong quá trình thêm vào chức năng TÌM KIẾM. Tôi đã theo dõi tài liệu dành cho nhà phát triển Android để thêm cả hộp thoại và tiện ích Tìm kiếm. Thật không may, bất cứ khi nào tôi thực hiện tìm kiếm, "onCreate" AND "onNewIntent" của Activity Activity được gọi. Đó là, bằng cách gõ một cái gì đó trong hộp Action Bar Search và nhấn ENTER, tìm kiếm được gọi là TWICE. Tôi bị kẹt. Một số lá cờ toàn cầu được cho là được trả lại từ hoạt động có thể tìm kiếm thông báo cho ứng dụng rằng tìm kiếm đã được hoàn thành chưa? Có phải cả hộp thoại Tìm kiếm và tiện ích con đang được gọi?Hoạt động có thể tìm kiếm được gọi hai lần

Tôi đã tìm kiếm các bài đăng trước trên trang web này và trên web mà không có kết quả. Cảm ơn bạn đã giúp đỡ.

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

Xin chào, bạn đã giải quyết vấn đề này chưa? Tôi đang đối mặt với cùng một điều – vinnybad

+0

Đối mặt với cùng một vấn đề. Bạn đã tìm thấy một giải pháp? –

+0

guys, bạn có thể cho tôi biết về thiết bị bạn tìm thấy vấn đề này? Tôi chỉ có thể tái tạo nó trên trình giả lập Genymotion nhưng không phải trên bất kỳ thiết bị nào khác (S3, S4, Galaxy Nexus chạy 4.0.4, Nexus 7 chạy 4.3) –

Trả lời

2

Cố gắng loại bỏ super.OnNewIntent (mục đích) trong SearchableActivity của bạn.

Theo biểu hiện của bạn bạn đang cố gắng sử dụng tìm kiếm thoại

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

và trong cùng một thời điểm bạn sử dụng SearchView trong Menu. Nếu bạn sử dụng SearchView, bạn nên sử dụng

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

như trong http://developer.android.com/guide/topics/search/searchable-config.html.

Đó là ví dụ của tôi về 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

Tôi nghĩ rằng phương pháp onNewIntent và onCreate loại trừ lẫn nhau. Bạn đặt launchMode thành "singleTop", vì vậy phương thức onNewIntent sẽ được gọi và không phải là onCreate.

Tôi gặp sự cố tương tự khi một yêu cầu tìm kiếm được xử lý hai lần. Làm việc với mẫu SearchableDictionary trong trình mô phỏng máy tính bảng WXGA 10.1 tôi thấy rằng cuộc gọi tìm kiếm đầu tiên hoạt động tốt, nhưng các cuộc gọi kết quả tạo ra hai sự kiện TÌM KIẾM, vì vậy chúng được xử lý hai lần. Ai đó đã đề cập đến một lỗi trong Ti. (http://developer.appcelerator.com/question/127166/android-search-keyboardtype-fires-return-event-twice)

Tôi đã thử nghiệm ứng dụng trên máy tính bảng thực sự của Samsung và tôi không thấy hai sự kiện TÌM KIẾM, vì vậy tôi đoán đó là vấn đề trình mô phỏng, không phải là sự cố mã.

+0

Dude, bạn đã cứu mạng của tôi>: D < –

+0

Sự cố vẫn tồn tại sau 3 năm sau ... mất một giờ để cố gắng gỡ lỗi mã :-( – henry000

Các vấn đề liên quan