2014-12-06 13 views
6

Widoki paska akcji (dostawca akcji akcji i widok wyszukiwania) zawiesza się po wygenerowaniu podpisanego pliku APK. Kiedy debugować aplikację z Android studio to działa, ale kiedy generowania podpisany APK i zainstalować aplikację na urządzeniu otrzymuję błędy tak:Błędy po utworzeniu 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) 

lub

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) 

Używam ostatnie wersje bibliotek wsparcia i pasek narzędzi. (ustawiając 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; 
    } 

Jak mogę rozwiązać ten problem? Jak wspomniano powyżej, dostaję błędy tylko po podpisaniu apk.

+0

możliwy duplikat [Co to jest wyjątek typu Null Pointer i jak mogę go naprawić?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and- how-do-i-fix-it) – 323go

+0

Dowiedz się, co to jest 'null' i upewnij się, że tak nie jest. – 323go

+0

@ 323go Wiem, że '(SearchView) searchItem.getActionView();' zwraca wartość null. ale nie wiem, dlaczego otrzymuję ten błąd po wygenerowaniu apk .. nie podczas debugowania – alashow

Odpowiedz

4

Dzieje się tak, ponieważ nie skonfigurowałeś odpowiednio swojego progaurd. W tobie build.gradle pod buildTypes i "wydanie" zmień runProguard true na runProguard false i wygeneruj zaświecony pakiet APK i przetestuj. Jeśli to działa dobrze, spróbuj nauczyć się poprawnie skonfigurować program progaurd :)

+0

Program progaurd może usunąć kod, który według niego nie jest używany, ale aplikacja może go faktycznie potrzebować. w takim przypadku musisz zidentyfikować klasę i dodać ją do konfiguracji prograurd, np. '-keep public class ' Czytaj więcej na http://developer.android.com/tools/help/proguard.html – Panther

+0

dzięki! Spróbuję :) – alashow

14

W proguard-rules.pro dodaj następujący wiersz, aby wykluczyć klasę SearchView: '-keep class android.support.v7.widget. ** { *; }, a następnie utwórz kompilację. Rozwiązałem to w ten sposób.

+0

Dziękuję człowieku, uratowałeś mój dzień, miałem zamiar zrezygnować z proguardu z powodu tego błędu :) –

+1

Znacznie lepsza odpowiedź niż po prostu wyłączenie proguard. Dziękuję Ci bardzo! –

+0

Dziękuję, bardzo pomocne. – user3910670

-1

Działa to dla mnie

Dodaj następujący wiersz do proguard-rules.pro plik znajdujący się wewnątrz folderu aplikacji:

-Trzymaj klasy android.support.v7.widget.SearchView {*; }

Powiązane problemy