2015-12-15 19 views
7

Cố gắng bao gồm một chế độ xem tìm kiếm trong thanh tác vụ. Đối với điều này, tôi đã làm những điều sau đây:Thêm SearchView trong Fragment

Created MenuSearch.xml trong thư mục trình đơn như được đưa ra dưới đây:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:id="@+id/action_search" 
    android:actionViewClass="Android.Support.V7.Widget.SearchView" 
    android:icon="@android:drawable/ic_menu_search" 
    android:showAsAction="always" 
    android:title="Search"/> 

</menu> 

Bao gồm các phương pháp OnCreateOptionsMenu trong đoạn:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater) 
    { 
     inflater.Inflate(Resource.Menu.MenuSearch, menu); 
     base.OnCreateOptionsMenu(menu, inflater); 
     var searchManager = (SearchManager) this.Activity.GetSystemService(Context.SearchService); 
     searchView = (SearchView) (menu.FindItem(Resource.Id.action_search).ActionView); 
     searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName)); 

    } 

Và tôi có đặt HasOptionsMenu = true; khi khởi động đoạn.

Với mã ở trên, tôi có con trỏ rỗng trong dòng searchView.SetSearchableInfo.... Không chắc chắn tại sao điều này xảy ra, mặc dù mọi thứ dường như là chính xác và đúng chỗ.

Dựa trên một số đề xuất để giải quyết vấn đề tương tự, tôi cũng đã thử tùy chọn dưới đây cho tìm kiếm.

 var item = menu.FindItem (Resource.Id.action_search); 
     var searchItem = MenuItemCompat.GetActionView(item); 
     searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>(); 
     searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName)); 

Nhưng một lần nữa, tôi nhận được searchView là rỗng.

Bây giờ tôi đã thử các tùy chọn có thể, tôi không biết gì về lý do tại sao searchview trở thành rỗng.

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

19

Change MenuSearch.xml của bạn để

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_search" 
     android:title="@string/app_name" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="collapseActionView|ifRoom" 
     /> 
</menu> 

Trong đoạn của bạn để thêm searchView.setOnQueryTextListener

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.search_option_menu, menu); 
     MenuItem item = menu.findItem(R.id.action_search); 
     SearchView searchView = new SearchView(((MainActivity) mContext).getSupportActionBar().getThemedContext()); 
     MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     MenuItemCompat.setActionView(item, searchView); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
       return false; 
      } 
     }); 
     searchView.setOnClickListener(new View.OnClickListener() { 
              @Override 
              public void onClick(View v) { 

              } 
             } 
     ); 
    } 
+1

nhận nullPointerException on SearchView searchView = new SearchView (((MainActivity) mContext) .getSupportActionBar(). GetThemedContext()); – Dinesh

+0

@Dinesh Tôi cũng nhận được điều này. Bạn đã quản lý để sửa chữa nó? – CapturedTree

+0

Kiểu ứng dụng của bạn có thể không hỗ trợ thanh tác vụ. Vui lòng kiểm tra xem phong cách của bạn có thực hiện điều đó hay không. –

-1

Trong onCreateOptionsMenu đoạn tôi mã

SearchManager searchManager = 
     (SearchManager)getActivity().getSystemService(Context.SEARCH_SERVICE); 
SearchableInfo searchableInfo = 
     searchManager.getSearchableInfo(getActivity().getComponentName()); 
searchItem = menu.findItem(R.id.menu_search); 
SearchView searchView = (SearchView) searchItem.getActionView(); 
searchView.setSearchableInfo(searchableInfo); 

sản xuất thông báo lỗi sau: java.lang.NullPointerException: Attemp t để gọi phương thức ảo 'void android.support.v7.widget.SearchView.setSearchableInfo (android.app.SearchableInfo)' trên tham chiếu đối tượng null

Sau khi tôi thay đổi trong menu.xml android: actionViewClass thành app: actionViewClass the vấn đề không xảy ra lần nữa. menu.xml:

<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="..."> 
<item 
android:id="@+id/menu_search" 
android:title="@string/menu_search" 
app:actionViewClass="android.support.v7.widget.SearchView" 
app:showAsAction="ifRoom"> 

1

tôi giải quyết vấn đề này tôi muốn chia sẻ câu trả lời của tôi cho SearchView NullPointerException

chúng ta cần phải loại bỏ dưới phương pháp từ Hoạt động chính

 public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      return true; 

và sử dụng phân đoạn bên trong trong OnActivityCreated setHasOptionsMenu(true) và phương pháp ghi đè

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle item selection 
     switch (item.getItemId()) { 
      case R.id.action_search: 

    //  onCall(); //your logic 

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

search_options_menu của bạn.xml sẽ trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/action_search" 
     android:title="@string/app_name" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="collapseActionView|ifRoom" 
     /> 
</menu> 

Override phương pháp onCreateOptionMenu trong đoạn của bạn setHasOptionsMenu(true); bên onCreate() trên mảnh của bạn.

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.search_option_menu, menu); 
     MenuItem item = menu.findItem(R.id.action_search); 
       SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); 
     MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     MenuItemCompat.setActionView(item, searchView); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
        //Do search code here 
       return true; 
      } 
     }); 

    }