2014-12-06 2 views
6

Сообщения о действиях (поставщик акций и поиск) сбой после генерации подписанного apk. Когда я отладка приложения из 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)).

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; 
    } 

Как я могу это исправить? Как сказано выше, я получаю ошибки только после подписания apk.

+0

Возможный дубликат [Что такое исключение Null Pointer Exception и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and- how-do-i-fix-it) – 323go

+0

Узнайте, что такое 'null' и убедитесь, что это не так. – 323go

+0

@ 323go Я знаю, что '(SearchView) searchItem.getActionView();' return null. но я не знаю, почему я получаю эту ошибку после генерации apk .. не при отладке – alashow

ответ

4

Это происходит потому, что вы не настроили свой progaurd соответствующим образом. В вас build.gradle под номером buildTypes и 'релиз' меняют runProguard true на runProguard false и сгенерируют сложенный APK и тест. Если это работает хорошо, попробуйте научиться правильно настроить progaurd :)

+0

progaurd может удалить код, который, по его мнению, не используется, но ваше приложение действительно может понадобиться. в этом случае вам нужно идентифицировать класс и добавить его в конфигурацию prograurd, например '-keep public class ' Подробнее о http://developer.android.com/tools/help/proguard.html – Panther

+0

спасибо! я попробую :) – alashow

14

В proguard-rules.pro добавьте следующую строку, чтобы исключить класс SearchView: '-keep class android.support.v7.widget. ** { *; } ', а затем создайте сборку. Я решил это так.

+0

Спасибо, человек, вы спасли мой день, я вот-вот должен был отказаться от proguard из-за этой ошибки :) –

+1

Гораздо лучший ответ, чем просто отключение proguard. Большое спасибо! –

+0

Спасибо, очень полезно. – user3910670

-1

Это работает для меня,

Добавьте следующую строку в proguard-rules.pro файл, расположенный внутри приложения папки:

-keep класса android.support.v7.widget.SearchView {*; }