2015-04-09 20 views
8

Tôi có 2 hoạt động: đầu tiên có thanh tác vụ với chế độ xem tìm kiếm, thứ hai sẽ hiển thị kết quả của truy vấn tìm kiếm.Bắt đầu hoạt động mới từ SearchView

androidmanifest:

<activity 
     android:name=".SearchActivity" 

     ... 
     android:launchMode="singleTop">   

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

    </activity> 

    <activity 
     android:name=".ResultsActivity" 
     ... 

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

    </activity> 

searchable.xml

<searchable 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="@string/app_name" 
android:hint="@string/enter_a_word" /> 

SearchActivity

.... 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_noun_list, menu); 

    // Associate searchable configuration with the SearchView 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    return true; 
} 
.... 

ResultsActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 

    } 
... 
} 

vấn đề là sau khi truy vấn được nhập vào trong chế độ xem tìm kiếm, không có gì xảy ra. Không có lỗi, không có gì. Làm thế nào tôi có thể mở kết quả sau khi truy vấn được nhập vào trong hoạt động tìm kiếm?

+0

Vì vậy, tôi cho rằng bạn có dữ liệu để tìm kiếm thông qua phải không? Bạn cũng đang triển khai bất kỳ giao diện nào trong hoạt động của mình? – Eenvincible

Trả lời

22

Câu trả lời này hơi muộn nhưng tôi cảm thấy câu trả lời sẽ hữu ích cho người xem trong tương lai. Tình thế tiến thoái lưỡng nan dường như đến từ sự mơ hồ của Android SearchView tutorial. Kịch bản mà chúng bao trùm giả định bạn sẽ hiển thị các kết quả trong cùng một Activity mà SearchView cư trú. Trong một kịch bản như vậy, thẻ Hoạt động trong file AndroidManifest.xml sẽ giống như thế này:

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

Sau đó, để xử lý các kết quả trong Hoạt động tương tự, bạn sẽ Ghi đè onNewIntent phương pháp:

@Override 
public void onNewIntent(Intent intent){ 
    setIntent(intent); 
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //now you can display the results 
    } 
} 

Tuy nhiên, trong trường hợp chúng tôi muốn hiển thị kết quả trong Hoạt động khác, chúng tôi phải đặt Bộ lọc mục tiêu và thẻ meta vào kết quả Hoạt động và giới thiệu thẻ meta mới cho Hoạt động SearchView. Vì vậy, hoạt động của chúng tôi sẽ giống như thế này trong file AndroidManifest.xml:

<activity 
     android:name=".MainActivity" 
     android:label="@string/main_activity_label" 
     android:launchMode="singleTop"> 
     <!-- meta tag points to the activity which displays the results --> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchResultsActivity" /> 
</activity> 
<activity 
     android:name=".SearchResultsActivity" 
     android:label="@string/results_activity_label" 
     android:parentActivityName="com.example.MainActivity"> 
     <!-- Parent activity meta-data to support 4.0 and lower --> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.MainActivity" /> 
     <!-- meta tag and intent filter go into results activity --> 
     <meta-data android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
</activity> 

Sau đó, trong phương pháp onCreateOptionsMenu MainActivity của chúng tôi, hãy kích hoạt SearchView (giả sử bạn đang thêm SearchView đến ActionBar).Thay vì sử dụng getComponentName() trong SearchManager của getSearchableInfo() gọi phương thức, chúng ta tạo một đối tượng ComponentName mới sử dụng bối cảnh của MainActivity và lớp SearchResultsActivity:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_home, menu); 
    SearchView search = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search); 
    // Associate searchable configuration with the SearchView 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    search.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class))); 
    search.setQueryHint(getResources().getString(R.string.search_hint)); 
    return true; 
} 

Cuối cùng, trong lớp SearchResultsActivity của chúng tôi, trong phương thức onCreate, chúng tôi có thể xử lý kết quả tìm kiếm:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //use the query to search your data somehow 
    } 
} 

Đừng quên để tạo ra các tập tin tài nguyên searchable.xml và thêm SearchView để bố trí của bạn.

searchable.xml (res/xml/searchable.xml; tạo thư mục xml dưới res nếu cần):

<?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" 
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"/> 

Layout (ví dụ về thêm SearchView để ActionBar như một mục trình đơn) :

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.MainActivity"> 
    <group android:checkableBehavior="single"> 
     <item android:id="@+id/action_search" android:title="Search" 
      android:orderInCategory="1" app:showAsAction="collapseActionView|ifRoom" 
      app:actionViewClass="android.support.v7.widget.SearchView"/> 
    </group> 
</menu> 

Resources:

+2

Trình diễn tuyệt vời – Raju

0

Nếu không nhìn thấy mã hoạt động của bạn, tôi khuyên bạn nên thử phương pháp này - cũng giả sử bạn có tất cả các tệp được tạo như đã nêu ở trên;

Trong hoạt động kết quả của bạn,

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

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    searchView.setIconifiedByDefault(false); 
    searchView.setQueryHint(getString(R.string.search_hint)); 

    searchView.setOnQueryTextListener(this); 

    return true; 
} 

Hãy nhớ rằng đây là hoạt động có dữ liệu của bạn mà bạn muốn thực hiện tìm kiếm:

Bạn phải thực hiện giao diện SearchView.OnQueryTextListener trong cùng hoạt động:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_search: 
      ProductsResulstActivity.this.finish(); 

      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    return false; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 

    productFilterAdapter.getFilter().filter(newText); 

    if (TextUtils.isEmpty(newText)) { 
     listView.clearTextFilter(); 
    } 
    else { 
     listView.setFilterText(newText); 
    } 

    return true; 
} 

productFilterAdapter là bộ điều hợp mà bạn phải tạo trước.

Cần triển khai giao diện có thể lọc. Tôi hi vọng cái này giúp được.

Nếu bạn cần hỗ trợ thêm, vui lòng cho tôi biết. Chúc may mắn

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