2014-11-20 19 views
52

Vì tôi implented ứng dụng compat SearchView tôi không hoạt động nữa:SearchView không hoạt động kể từ khi ứng dụng compat

Process: com.laurenswuyts.witpa, PID: 26666 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference 
      at com.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.java:75) 
      at android.app.Activity.onCreatePanelMenu(Activity.java:2820) 
      at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275) 
      at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276) 
      at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79) 
      at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49) 
      at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459) 
      at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Vì vậy nullpointer cho SearchView trong khi tôi có nó:

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

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


     return super.onCreateOptionsMenu(menu); 
    } 

Và trong tôi menu Tôi có điều này:

<!-- Search Widget --> 
    <item android:id="@+id/action_search" 
     android:title="@string/action_search" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="always" 
     android:actionViewClass="android.support.v7.widget.SearchView"/> 

Tôi không biết tại sao nó không hoạt động nữa nhưng nó đã xảy ra kể từ khi tôi bắt đầu sử dụng đồng ứng dụng mpat 21.

Kính trọng,

Trả lời

215

Hãy thử sử dụng các không gian tên tùy chỉnh app cho actionViewClass của bạn quá:

app:actionViewClass="android.support.v7.widget.SearchView"/> 
+0

Thật tuyệt vời, bạn có thể giải thích cho tôi lý do tôi phải sử dụng ứng dụng thay vì Android không? – Laurenswuyts

+2

@Laurenswuyts kể từ khi bạn bắt đầu sử dụng thư viện hỗ trợ, một số thuộc tính hiện phải được xác định bằng không gian tên tùy chỉnh. Bạn có không gian tên đó được xác định trong tệp trình đơn của bạn. Bạn có thể tìm thêm một số thông tin trong [tài liệu] (http://developer.android.com/training/custom-views/create-view.html#customattr). – Simas

+9

Tôi sử dụng ứng dụng: không gian tên, và nó hoạt động trên phiên bản gỡ lỗi, nhưng nó gây ra lỗi tương tự trong chế độ phát hành khi tôi đã minifyEnabled đúng trong gradle.build, bất kỳ đề nghị? –

14

này cũng có thể xảy ra nếu bạn đã bật Proguard và nó là vằn aways SearchView lớp. Bạn sẽ cần phải sửa đổi cài đặt proguard để giữ cho lớp.

Xem this câu hỏi để biết thêm chi tiết.

10

sau một lúc phát "chạy & lỗi" Tôi đã tìm thấy giải pháp .. Hình như phần tử giao diện người dùng không phải là nguyên nhân gây ra lỗi. Sau khi thiết lập tìm kiếm cho QueryListener nó hoạt động tốt. Dưới đây là một số mã:

Hoạt động chứa thanh tìm kiếm:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 

     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String s) { 
       Log.d(TAG, "onQueryTextSubmit "); 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String s) { 
       Log.d(TAG, "onQueryTextChange "); 
       return false; 
      } 
     }); 

     return true; 
    } 

searchable.xml

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

Và "SearchBar" trong menu.xml

 <item 
      android:id="@+id/search" 
      android:title="@string/search_title" 
      android:icon="@drawable/abc_ic_search_api_mtrl_alpha" 
      app:showAsAction="collapseActionView|ifRoom" 
      app:actionViewClass="android.support.v7.widget.SearchView"/> 

... 

Và cuối cùng, nhưng không kém, manifest (nhưng điều này nên được rõ ràng) ... chi tiết

<activity 
     android:name=".activities.MainActivity" 
     android:label="@string/title_activity_main"> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable"/> 
    </activity> 

thông tin ->Docs

8

Nó rất một thông tin bổ sung cho Simas câu trả lời. Tôi thấy điều này trong câu trả lời khác (https://stackoverflow.com/a/33400808/4949671) và nó là rất quan trọng để giải quyết ngoại lệ của tôi:

Chú ý rằng, đó là, app:actionViewClassKHÔNG android:actionViewClass

25

Thêm dòng sau vào proguard-rules.pro tập tin nằm bên trong ứng dụng thư mục:

lớp -keep android.support.v7.widget.SearchView {*; }

+1

làm việc như quyến rũ ... Cảm ơn Man! –

+0

Trợ giúp tuyệt vời. Mới đối với hệ thống Proguard. Nhưng hàng lót này đã giúp rất nhiều – Jigar

0

Sau khi bạn đã nhấp vào kết quả, ứng dụng của bạn đang mong đợi rằng một thao tác chưa hoàn thành và đang cố gắng đi xa hơn vào đối số Intent.

SearchView.OnSuggestionListener và trả lại true thông báo cho ứng dụng của bạn rằng thao tác nhấp chuột đã hoàn tất.

 searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { 

      @Override 
      public boolean onSuggestionClick(int position) { 
       return true; 
      } 

      @Override 
      public boolean onSuggestionSelect(int position) { 
       return false; 
      } 
     }); 
1

Nếu bạn sử dụng progurd sau đó bạn phải thêm dòng sau vào proguard-rules.pro tập tin

-keep public class android.support.v7.widget. ** {*; }

hoặc

-keep lớp android.support.v7.widget.SearchView {*; }

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