2014-12-06 22 views
6

Chế độ xem thanh tác vụ (chia sẻ nhà cung cấp hành động và tìm kiếm) gặp sự cố sau khi tạo apk đã ký. Khi tôi gỡ lỗi ứng dụng từ studio android nó làm việc nhưng khi tôi tạo apk ký và cài đặt ứng dụng vào điện thoại tôi nhận được lỗi như thế này:Lỗi sau khi tạo apk

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setQueryHint(java.lang.CharSequence)' on a null object reference 
      at tm.veriloft.ertir.ui.SearchActivity.onCreateOptionsMenu(Unknown Source) 
      at android.app.Activity.onCreatePanelMenu(Activity.java:2820) 
      at android.support.v4.app.o.onCreatePanelMenu(Unknown Source) 
      at android.support.v7.app.e.a(Unknown Source) 
      at android.support.v7.app.g.a(Unknown Source) 
      at android.support.v7.widget.as.a(Unknown Source) 
      at android.support.v7.internal.a.a.j(Unknown Source) 
      at android.support.v7.internal.a.b.run(Unknown Source) 
      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) 

hoặc

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.ah.a(android.content.Intent)' on a null object reference 
      at tm.veriloft.ertir.ui.BlogViewActivity.onCreateOptionsMenu(Unknown Source) 
      at android.app.Activity.onCreatePanelMenu(Activity.java:2820) 
      at android.support.v4.app.o.onCreatePanelMenu(Unknown Source) 
      at android.support.v7.app.e.a(Unknown Source) 
      at android.support.v7.app.g.a(Unknown Source) 
      at android.support.v7.widget.as.a(Unknown Source) 
      at android.support.v7.internal.a.a.j(Unknown Source) 
      at android.support.v7.internal.a.b.run(Unknown Source) 
      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) 

Tôi đang sử dụng phiên bản cuối cùng của thư viện hỗ trợ và thanh công cụ. (bằng cách thiết lập setSupportActionBar(mToolbar)).

SearchView xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:ertir="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/action_search" 
     android:title="@string/title_activity_search" 
     ertir:showAsAction="always" 
     ertir:actionViewClass="android.support.v7.widget.SearchView" /> 
</menu> 

Java

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.search, menu); 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     mSearchView = (SearchView) searchItem.getActionView(); 
     mSearchView.setQueryHint(getString(R.string.search_hint)); 
     mSearchView.setFocusable(true); 
     mSearchView.setIconified(false); 
     mSearchView.requestFocusFromTouch(); 
     mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       mSearchView.clearFocus(); //Hide keyboard 
       search(query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType()); 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String query) { 
       if (searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType().equals("blogs")) 
        searchAfter(1100, query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType()); 
       else 
        search(query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType()); 
       return false; 
      } 
     }); 
     return true; 
    } 

Làm thế nào tôi có thể sửa lỗi này? Như đã nói ở trên, tôi nhận được lỗi chỉ sau khi ký apk.

+0

bản sao có thể có của [Ngoại lệ con trỏ rỗng là gì và cách khắc phục sự cố này?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and- Làm thế nào-do-i-fix-it) – 323go

+0

Tìm hiểu những gì 'null' và chắc chắn rằng nó không phải là. – 323go

+0

@ 323go tôi biết rằng '(SearchView) searchItem.getActionView();' trả về null. nhưng tôi không biết tại sao tôi nhận được lỗi này sau khi tạo apk..không phải khi gỡ lỗi – alashow

Trả lời

4

Điều này xảy ra vì bạn chưa định cấu hình progaurd một cách thích hợp. Trong số build.gradle dưới buildTypes và 'phát hành' thay đổi runProguard true thành runProguard false và tạo APK và thử nghiệm đã chọn. Nếu nó hoạt động tốt, hãy thử tìm hiểu cách định cấu hình progaurd một cách thích hợp :)

+0

progaurd có thể xóa mã mà nó cho là không được sử dụng, nhưng ứng dụng của bạn có thể thực sự cần nó. trong trường hợp đó bạn phải xác định lớp và thêm nó vào cấu hình prograurd như '-keep public class 'Đọc thêm trên http://developer.android.com/tools/help/proguard.html – Panther

+0

cảm ơn! Tôi sẽ cố gắng :) – alashow

14

Trong proguard-rules.pro, thêm dòng sau để loại trừ lớp SearchView: '-keep class android.support.v7.widget. ** { *; } 'và sau đó tạo bản dựng. Tôi giải quyết nó như thế này.

+0

Cảm ơn người đàn ông, bạn đã cứu ngày của tôi, tôi đã được về để cho lên trên proguard do lỗi này :) –

+1

Một câu trả lời tốt hơn nhiều so với chỉ vô hiệu hóa proguard. Cảm ơn nhiều! –

+0

Cảm ơn bạn, rất hữu ích. – user3910670

-1

này làm việc cho tôi,

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

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

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