2012-04-19 54 views
13

Tôi đang cố gắng sử dụng SearchViewCompat với ActionBarSherlock trong ứng dụng API 8.ví dụ android.support.v4.widget.SearchViewCompat?

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem item = menu.add("Search") 
     .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search) 
     .setActionView(R.layout.collapsible_edittext); 
    item.setShowAsAction(
     MenuItem.SHOW_AS_ACTION_ALWAYS | 
     MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

    // To use SearchViewCompat, I need to add it to the Menu item as well: 
    View searchView = SearchViewCompat.newSearchView(this); 
    // ... 
    SearchViewCompat.setOnQueryTextListener(...); 
    // ... 
    item.setActionView(searchView); 

Xin lưu ý rằng cả mã trên cùng và dưới cùng cần gọi setActionView(). Điều đó có nghĩa là không thể thực hiện tìm kiếm?

+1

Thay vì yêu cầu mã bạn có thể thêm mã bạn đã có cho đến nay câu hỏi của bạn. Có lẽ mọi người có thể giúp bạn khắc phục sự cố của mình. – THelper

+1

Cảm ơn THELper. Ngoài ra, có vẻ như tài liệu cục bộ của tôi đã lỗi thời và tôi đã tìm thấy một chủ đề dành cho nhà phát triển cụ thể: http://developer.android.com/training/search/backward-compat.html – woodglue

Trả lời

2

Vấn đề thực tế là gì? SearchViewCompat sẽ trả lại null cho thiết bị trước HC vì tiện ích SearchView không tồn tại. Điều này có nghĩa là bạn sẽ phải cung cấp chế độ xem hành động tùy chỉnh của riêng bạn mà bắt chước HC SearchView.

Bạn cũng có thể quay lại thành phần SearchView từ các nguồn Android và sử dụng.

Nếu không, bạn có thể sử dụng giao diện tìm kiếm hiện có mà Android có, trong trường hợp thiết bị HC + bạn sử dụng chế độ xem hành động để thực hiện tìm kiếm nhưng trên thiết bị Froyo và Gingerbread người dùng nhấp vào biểu tượng tìm kiếm và thanh tìm kiếm từ trên cùng.

Hy vọng điều này sẽ hữu ích.

+0

Bạn có thể trỏ đến triển khai, nếu có? –

6

Nếu bạn đang sử dụng ActionBarSherlock Library ver 4.2, bạn có thể thay thế các API 11 SearchView Widget với một ActionBarSherlock SearchView Widget để làm cho nó tương thích ngược:

search.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_search" 
     android:icon="@drawable/ic_action_search" 
     android:title="@string/description_search" 
     android:orderInCategory="0" 
     android:actionViewClass="com.actionbarsherlock.widget.SearchView" 
     android:showAsAction="ifRoom|collapseActionView" /> 
</menu> 

Lớp hoạt động

//IMPORTANT!!! 
import com.actionbarsherlock.widget.SearchView; 

.. .

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getSupportMenuInflater().inflate(R.menu.search, menu); 
    setupSearchMenuItem(menu); 
    return true; 
} 

private void setupSearchMenuItem(Menu menu) { 
    MenuItem searchItem = menu.findItem(R.id.menu_search); 
    if (searchItem != null) { 
     SearchView searchView = (SearchView) searchItem.getActionView(); 
     if (searchView != null) { 
      SearchManager searchManager = 
       (SearchManager) getSystemService(SEARCH_SERVICE); 
      searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
      } 
     } 
    } 
} 
2

Tại một số điểm trong hoạt động của bạn:

public class HomeActivity extends SherlockFragmentActivity implements 
    SearchView.OnQueryTextListener { 

// ...  
SearchView searchView = (com.actionbarsherlock.widget.SearchView) 
    actionBarCustom.findViewById(R.id.search); 
SearchManager sm = (SearchManager)getSystemService(SEARCH_SERVICE); 
searchView.setSearchableInfo(sm.getSearchableInfo(getComponentName())); 
searchView.setSubmitButtonEnabled(true); 
searchView.setOnQueryTextListener(this); 

Và sau đó lọc bộ chuyển đổi danh sách của bạn:

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

@Override 
public boolean onQueryTextChange(String newText) { 
    mAdapter.getFilter().filter(newText.trim()); 
    return false; 
} 

Bằng cách này, bộ chuyển đổi danh sách của bạn phải thực hiện lọc.

0

Tốt hơn để sử dụng MenuItemCompat, tôi nghĩ rằng đây là hữu ích cho bạn

getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.search); 
    SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem); 
    SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
    searchView.setSearchableInfo(info);