2013-06-26 23 views
9

Tôi đã bị mắc kẹt về điều này trong một thời gian ngắn. Tôi đã xem xét các câu trả lời khác trên SO nhưng chúng không giúp tôi giải quyết vấn đề của mình.Hộp Thoại Tìm Kiếm không được gọi là onSearchRequested()

Vấn đề của tôi là hộp thoại tìm kiếm không được gọi bởi onSearchRequested(). Tôi không thể tìm ra những gì đang xảy ra với tìm kiếm của tôi ...

Mã liên quan như sau ...

Manifest

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

/res/xml/searchable.xml

<?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" > 

</searchable> 

Tôi có tài nguyên chuỗi được xác định trong strings.xml.

lớp SearchableActivity

public class SearchableActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d("SEARCH", "HERE"); 
      handleIntent(getIntent()); 
     } 

     public void onNewIntent(Intent intent) { 
      setIntent(intent); 
      handleIntent(intent); 
     } 

     public void onListItemClick(ListView l, View v, int position, long id) { 
      // call the appropriate detail activity 
     } 

     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) { 
      Toast.makeText(getApplicationContext(), queryStr, Toast.LENGTH_LONG).show(); 
     } 

} 

Các đoạn mã trong hoạt động đó là cách gọi việc tìm kiếm ...

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getTitle().equals("Search")) { 
     Toast.makeText(getApplicationContext(), "Search = "+onSearchRequested(), Toast.LENGTH_LONG).show(); 
     return onSearchRequested(); 
    } else { 
     return false; 
    } 
} 

onSearchRequested() đang trở lại true. Nhưng số SearchableActivity không được gọi. Bất kỳ trợ giúp được đánh giá cao.

Cảm ơn bạn rất nhiều.


CẬP NHẬT

Đừng bận tâm! Tôi đã hiểu rồi!

Giải pháp là di chuyển meta-data bên ngoài thẻ activity và bên trong thẻ application. Đã thêm dưới đây làm câu trả lời cho những người gặp sự cố này.

Cảm ơn.

Trả lời

1

CẬP NHẬT

bạn phải overrideonNewIntent()

thay đổi biểu hiện để

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.default_searchable" 
     android:resource="@xml/searchable" 
     android:value=".SearchableActivity" /> 
</activity> 
+0

Cảm ơn. Đã cố gắng thêm 'android: value =". SearchableActivity' vào 'meta-data' nhưng không trợ giúp. – neo108

+0

hey try overriding theNewIntent() –

2

Got nó làm việc.

Giải pháp là để di chuyển meta-data bên ngoài thẻ activity và bên trong thẻ application, như sau ...

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

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

Cảm ơn!

+3

Bạn có cảm ơn chính mình đã trả lời câu hỏi của riêng bạn không? – SK9

+2

Điều này không phù hợp với tôi –

+0

điều này sẽ hoạt động nhưng không bắt buộc phải đặt nó bên ngoài thẻ hoạt động Hãy xem câu trả lời của tôi: – Tomasz

3

Bạn không phải di chuyển siêu dữ liệu bên ngoài thẻ hoạt động trừ khi bạn muốn mọi hoạt động trong ứng dụng của mình cung cấp hộp thoại tìm kiếm.Lý do nó có thể không hiệu quả với bạn là vì bạn đặt siêu dữ liệu vào hoạt động sai và di chuyển nó ra ngoài giải quyết vấn đề.

Đừng nhầm lẫn ResearchActivity với Hoạt động mà các cuộc gọi nó như thế này:

<activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

Nó cung cấp cho không có lỗi, nhưng không hoạt động. Ví dụ làm việc:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name"> 
     <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=".SearchableActivity" /> 
    </activity> 
    <activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     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> 
</application> 

MainActivity là hoạt động cung cấp hộp thoại tìm kiếm (nó có thể cũng search widget) và SearchableActivity là hoạt động bắt đầu sau khi người dùng yêu cầu tìm kiếm và onSearchRequested() được gọi.

+0

Tomek đưa ra câu trả lời đúng. Android thực sự gây nhầm lẫn khi có ** android.app.default_searchable ** và ** android.app.default_searchable ** có tên tương tự nhưng có ý nghĩa khác nhau. Nó chỉ bị nhầm lẫn với lập trình viên Android mới –

1

Bạn cần phải khai báo đường dẫn đầy đủ để tìm kiếm hoạt động

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.example.search.SearchableActivity" /> 
+1

Nó giải quyết được vấn đề của tôi –

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