2014-05-08 18 views
14

Đây là cách để điều hướng thông qua các ứng dụng của tôi:Fragment thay thế gây nên onQueryTextChange trên SearchView

  • mở mảnh với danh sách
  • danh sách
  • Lọc theo một văn bản nhập vào SearchView
  • Tap trên listitem (liệt kê đoạn được thay thế bởi mảnh chi tiết)
  • Navigate lại (đoạn chi tiết được thay thế bằng danh sách fragment)

Khi tôi Navi từ danh sách đến từng chi tiết, tôi muốn giữ bộ lọc hiện tại của chế độ xem tìm kiếm trong biến chuỗi. Tôi lưu trữ giá trị của searchview khi onQueryTextChange được thực hiện.

Vấn đề: Tôi không thể lưu trữ giá trị bộ lọc thực tế vì onQueryTextChange được gọi khi tôi điều hướng từ danh sách đến chi tiết vì đã xóa nội dung của chế độ xem tìm kiếm.

// ... 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String s) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String s) { 
      searchReceived(s); 
      return true; 
     } 
    }); 
// ... 

public void searchReceived(String searchQuery) 
{ 
    this.stateHolder.searchQuery = searchQuery; 
    // more code... 
} 

Khi tôi muốn khôi phục bộ lọc khi điều hướng trở lại, nó chỉ lọc với một chuỗi rỗng vì giá trị sai đã được lưu trữ trong this.stateHolder.searchQuery.

Stack:

onQueryTextChange():139, EmployeeListFragment$1 {com.example.exampleapp.fragment} 
onTextChanged():1153, SearchView {android.widget} 
access$2000():92, SearchView {android.widget} 
onTextChanged():1638, SearchView$11 {android.widget} 
sendOnTextChanged():7408, TextView {android.widget} 
setText():3816, TextView {android.widget} 
setText():3671, TextView {android.widget} 
setText():80, EditText {android.widget} 
setText():3646, TextView {android.widget} 
setQuery():511, SearchView {android.widget} 
onActionViewCollapsed():1250, SearchView {android.widget} 
collapseItemActionView():1662, ActionBarView$ExpandedActionViewMenuPresenter {com.android.internal.widget} 
collapseItemActionView():1258, MenuBuilder {com.android.internal.view.menu} 
clear():521, MenuBuilder {com.android.internal.view.menu} 
doInvalidatePanelMenu():789, PhoneWindow {com.android.internal.policy.impl} 
run():221, PhoneWindow$1 {com.android.internal.policy.impl} 

Làm thế nào tôi có thể ngăn chặn sự SearchView khỏi bị xóa bởi hệ thống khi điều hướng?

Cảm ơn.

+0

Bạn có tìm thấy giải pháp nào cho vấn đề này không? – starrystar

+0

@starrystar Tôi đã đăng giải pháp có thể có tại đây: https://stackoverflow.com/questions/23544382/fragment-replacement-triggers-onquerytextchange-on-searchview#23558681 – Tom

Trả lời

0

Tôi đã sửa đổi thuộc tính mục menu showAsAction từ android:showAsAction="always|collapseActionView" thành android:showAsAction="always". Bây giờ giao diện và hành vi của chế độ xem tìm kiếm đã thay đổi một chút, nhưng searchQuery không bị xóa!

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
      android:id="@+id/actionSearch" 
      android:icon="@android:drawable/ic_menu_search" 
      android:actionViewClass="android.widget.SearchView" 
      android:showAsAction="always" 
      android:title="@android:string/search_go" 
    /> 
</menu> 
2

Tôi thấy bạn không tìm thấy một giải pháp nêu ra, tôi có cùng problem posted here:

tôi thấy rằng khi invalidateOptionsMenu được gọi là phương pháp cũng onQueryTextChange được gọi vì Xem ra mắt dispatchRestoreInstanceState với trước giá trị sau khi bạn đã xóa tìm kiếm chẳng hạn. Bạn có gọi invalidateOptionsMenu có thể không?

Có lẽ, bênonQueryTextChange, bạn có thể kiểm tra một boolean trên một số tình trạng hiện tại của các đối tượng ứng dụng của bạn để biết nếu nội dung phương pháp nên được thực thi. Trong trường hợp của tôi, tôi sử dụng mDrawerLayout.isDrawerOpen(..) để cho phép tìm kiếm.

Ngoài ra bạn có thể thực hiện các SearchView.OnQueryTextListener trên mỗi lớp bạn sử dụng, trên Fragment hoặc trên lớp Hoạt động chính, đâu đó trong lớp học mà bạn có thể thiết lập một biến mô-đun boolean rằng bạn sẽ kiểm tra bên trong onQueryTextChange.

+0

Tôi đã đăng giải pháp của mình có thể giúp bạn cho câu hỏi của bạn. –

4

Sau 2 ngày của Googling tôi đã nhận được giải pháp chắc chắn sẽ giúp bạn.

Tôi vừa cut and pasted đang onCreateOptionMenu()-onPrepareOptionMenu()

Tôi không biết tại sao nó xảy ra, tôi nghĩ rằng người nghe của searchView sẽ không được NULL bởi cách bạn có thể thay đổi mã của bạn theo cách này.

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    getSherlockActivity().getSupportMenuInflater().inflate(R.menu.menu_all_order, menu); 

    searchView = (SearchView) menu.findItem(R.id.menu_all_order_search).getActionView(); 
    searchView.setInputType(InputType.TYPE_CLASS_NUMBER); 
    searchView.setQueryHint("Enter Order No"); 
    searchView.setOnQueryTextListener(this); 
} 

và Di:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
} 

Cảm ơn :)

+0

Tôi đã thử nó theo nhiều cách nhưng 'onQueryTextChange' không được gọi trong từng phần của ứng dụng của tôi. –

0

Đây là giải pháp của tôi:

@Override 
     public boolean onQueryTextChange(final String newText) { 

      if (searchTF.isIconified()) 
       return false; 

      // put the "real" onQueryTextChange actions here 


      return true; 


     } 
1

Vấn đề là ActionBar (và thành phần phụ) đều sụp đổ khi mảnh giữ nó được thay thế. Khi điều này xảy ra, truy vấn SearchView sẽ bị xóa như đã thấy trong onActionViewCollapsed. Cách giải quyết bao gồm:

Ngăn chặn sụp đổ

Di setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); từ mã tạo của SearchView hoặc android:showAsAction="collapseActionView" từ mã xml của nó.

này sẽ ảnh hưởng như thế nào/khi nút đóng/kiếm bằng giọng nói của view được hiển thị khi cố gắng để sụp đổ nó

Nó sẽ cũng có thể để ngăn chặn sụp đổ bằng cách ghi đè phương pháp onActionViewCollapsed SearchView của() để làm gì, nhưng sẽ hoàn thành giống nhau.

Bỏ qua truy vấn thay đổi khi cần thiết

Khi đoạn là không hợp lệ (bị thay thế) sau đó bỏ qua những thay đổi truy vấn mà nếu không sẽ gây ra các đoạn để thay đổi nội dung truy vấn lưu hoặc bố trí (thay đổi cách bố trí sẽ gây ra một ngoại lệ nếu đoạn không thực sự có nội dung xem).

public boolean onQueryTextChange(String newText) { 
    if (!isVisible()) { 
     // The fragment was replaced so ignore 
     return true; 
    } 
    // Text was actually changed, perform search 
    return true; 
} 

Đây sẽ là lựa chọn tốt hơn vì nó không ảnh hưởng đến chức năng của chế độ xem tìm kiếm.

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