2014-12-06 214 views
6

生成簽名的apk後,操作欄視圖(共享操作提供程序和searchview)崩潰。當調試從Android Studio中的應用程序它的工作,但是當我生成簽署APK安裝應用設備我得到象這樣的錯誤:構建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) 

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) 

我使用的是支持庫的最後版本和工具欄。 (通過設定setSupportActionBar(mToolbar))。

搜索查看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; 
    } 

我怎樣才能解決這個問題?就像上面說的,我只有在簽署apk之後纔會出錯。

+0

可能重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-我怎麼辦 - 修復它) – 323go 2014-12-06 19:36:00

+0

找出什麼'null'並確保它不是。 – 323go 2014-12-06 19:36:21

+0

@ 323go我知道'(SearchView)searchItem.getActionView();'返回null。但我不知道爲什麼我在生成apk..not後得到這個錯誤..當調試 – alashow 2014-12-06 19:38:45

回答

4

發生這種情況的原因是您尚未適當配置您的progaurd。在你的build.gradlebuildTypes和'釋放'改變runProguard truerunProguard false並生成燒焦APK和測試。如果運行良好,請嘗試學習正確配置progaurd :)

+0

progaurd可能會刪除它認爲未使用的代碼,但您的應用程序可能實際上需要它。在這種情況下,您必須確定類並將其添加到程序配置中,例如'-keep public class '請參閱http://developer.android.com/tools/help/proguard.html – Panther 2014-12-06 20:14:35

+0

謝謝!我會嘗試:) – alashow 2014-12-06 20:16:54

14

在proguard-rules.pro中,添加以下行以排除SearchView類:012ke'-keep class android.support.v7.widget。** { *; }'然後創建構建。我是這樣解決的。

+0

謝謝你的男人,你救了我的一天,我正準備放棄proguard因爲這個錯誤:) – 2016-01-10 17:08:19

+1

一個比只是禁用proguard更好的答案。非常感謝你! – 2016-08-03 20:21:25

+0

謝謝,非常有幫助。 – user3910670 2017-11-20 17:01:20

-1

這對我的作品,

添加以下行proguard-rules.pro位於應用程序文件夾中的文件:

-keep類android.support.v7.widget.SearchView {*; }