2014-09-04 17 views
8

Próbowałem zaktualizować wszystkie biblioteki, ale wciąż mam błędy. Jestem w stanie uruchomić aplikację na symulatorze, ale kiedy wyeksportuję plik APK i uruchomię go na prawdziwym urządzeniu z Androidem, aplikacja nie działa.Android SearchView nie działa

MinSdkVersion ma wartość 8, targetSdkVersion ma wartość 19. Proszę o pomoc!

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:example="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/action_showTC" 
     android:orderInCategory="100" 
     android:showAsAction="never" 
     android:title="Terms and Conditions"/> 

    <item android:id="@+id/action_search" 
      android:title="Search" 
      android:orderInCategory="100" 
      example:showAsAction="ifRoom|collapseActionView" 
      example:actionViewClass="android.support.v7.widget.SearchView"/> 

</menu> 

SearchView

@Override 
public boolean onOptionsItemSelected(MenuItem item){ 
    if(item.getItemId() == R.id.action_showTC){ 
     startActivity(new Intent(MainActivity.this, T_C.class)); 
     return true; 
    }else{ 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SupportMenuItem searchMenuItem = ((SupportMenuItem) menu.findItem(R.id.action_search)); 
    SearchView searchView = (SearchView) searchMenuItem.getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    return super.onCreateOptionsMenu(menu); 
} 

oczywisty

<activity android:name="com.agehk.queue.SearchResultsActivity" 
     android:parentActivityName="com.agehk.queue.MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:hint="Search Queue" 
    android:label="@string/app_name" /> 

Błąd

09-04 15:57:13.105: W/SupportMenuInflater(17184): Cannot instantiate class: android.support.v7.widget.SearchView 
09-04 15:57:13.105: W/SupportMenuInflater(17184): java.lang.NoSuchMethodException: <init> [class android.content.Context] 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.Class.getConstructorOrMethod(Class.java:423) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.Class.getConstructor(Class.java:397) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.f.a(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.f.a(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.f.b(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.d.a(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.internal.view.d.inflate(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.app.Activity.onCreatePanelMenu(Activity.java:2577) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v4.app.j.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.a.g.a(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.a.n.a(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.a.g.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.support.v7.a.o.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer.doCallbacks(Choreographer.java:626) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer.doFrame(Choreographer.java:589) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Handler.handleCallback(Handler.java:730) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.os.Looper.loop(Looper.java:150) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at android.app.ActivityThread.main(ActivityThread.java:5390) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.reflect.Method.invokeNative(Native Method) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at java.lang.reflect.Method.invoke(Method.java:525) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-04 15:57:13.105: W/SupportMenuInflater(17184): at dalvik.system.NativeStart.main(Native Method) 
09-04 15:57:13.105: D/AndroidRuntime(17184): Shutting down VM 
09-04 15:57:13.105: W/dalvikvm(17184): threadid=1: thread exiting with uncaught exception (group=0x42f05500) 
09-04 15:57:13.105: E/AndroidRuntime(17184): FATAL EXCEPTION: main 
09-04 15:57:13.105: E/AndroidRuntime(17184): java.lang.NullPointerException 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.agehk.queue.MainActivity.onCreateOptionsMenu(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.app.Activity.onCreatePanelMenu(Activity.java:2577) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v4.app.j.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.a.g.a(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.a.n.a(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.a.g.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.support.v7.a.o.onCreatePanelMenu(Unknown Source) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:414) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:777) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:199) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:835) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer.doCallbacks(Choreographer.java:626) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer.doFrame(Choreographer.java:589) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:821) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Handler.handleCallback(Handler.java:730) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.os.Looper.loop(Looper.java:150) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at android.app.ActivityThread.main(ActivityThread.java:5390) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at java.lang.reflect.Method.invokeNative(Native Method) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at java.lang.reflect.Method.invoke(Method.java:525) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-04 15:57:13.105: E/AndroidRuntime(17184): at dalvik.system.NativeStart.main(Native Method) 
09-04 15:57:13.115: D/BatteryStatsImpl(445): noteStopWakeLocked com.google.android.gms isFromForeground = false 
09-04 15:57:13.115: W/ActivityManager(445): Force finishing activity com.agehk.queue/.MainActivity 
+0

jaki poziom minsdk użyć? –

+0

MinSdkVersion to 8 –

Odpowiedz

0

Dla API przed 11 powinna zainicjować Action Bar Produkty w trybie zgodności:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
     SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchMenuItem); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
     return true; 
    } 

Aktualizacja:
Tak , Próbowałem odtworzyć go w API 8 emulator i 4.4 KitKat. Niestety moje urządzenie 2.3.8 zostało zamurowane jakiś czas temu, więc nie można było sprawdzić sprzętu z niskim API. Co mogę zaproponować Ci:
1. Sprawdź, SearchView jest importowany z android.support.v7.widget.SearchView;
2. Sprawdź menu zasobu jest poprawna:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" <----------- init compatible namespace 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity" > 

    <item 
     android:id="@+id/action_showTC" 
     android:orderInCategory="100" 
     android:title="@string/terms_and_conditions" 
     app:showAsAction="never"/> <----------- use compatible namespace 

    <item android:id="@+id/action_search" 
      android:title="@string/search" 
      android:orderInCategory="100" <---------- use different value 
      app:showAsAction="ifRoom|collapseActionView" 
      app:actionViewClass="android.support.v7.widget.SearchView"/> 

</menu> 

3. powrót prawda od onCreateOptionsMenu jeśli nie ma bazowy przetwarzanie (klasa nie jest aktywny subklassed)
UPDATE2: GOT IT! Prawdopodobnie rozciąga się od klasy Activity. Powinny być ActioBarActivity:

public class MainActivity extends ActionBarActivity { 
... 
+0

Czy tak jest, ale nadal ma ten sam błąd. 'MenuItem searchMenuItem = menu.findItem (R.id.action_search); SearchManager searchManager = (SearchManager) getSystemService (Context.SEARCH_SERVICE); SearchView searchView = (SearchView) MenuItemCompat.getActionView (searchMenuItem); searchView.setSearchableInfo (searchManager.getSearchableInfo (getComponentName())); ' –

+0

Proszę spojrzeć na http://developer.android.com/training/search/backward-compat.html#check-ver –

+0

Nie wiem kiedy się pomyliłem, ale nadal nie działa. Czy możesz mi pokazać, jak napisać całą część. To pytanie wprawia mnie w zakłopotanie przez długi czas. Proszę!!! –

14

Jeżeli masz włączony PROGUARD w budowie? Jeśli tak, możesz chcieć upewnić się, że biblioteki appcompat znajdują się na liście wykluczeń progu (w proguard.cfg). Podejście brute force jest, aby zachować wszystkie klasy z biblioteki wsparcia:

-keep class android.support.v4.app.** { *; } 
    -keep interface android.support.v4.app.** { *; } 
    -keep class android.support.v7.app.** { *; } 
    -keep interface android.support.v7.app.** { *; } 

W moim przypadku, miałem klasę, która przedłużony SearchView biblioteki obsługi tak, dodałem to do mojego PROGUARD.cfg:

-keep public class * extends android.support.v7.widget.SearchView { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

Konstruktorzy są szczegółowo wymienione w celu uniknięcia błędu:

java.lang.NoSuchMethodException: <init> [class android.content.Context] 
+3

to nie działa dla mnie, ale -keep klasy android.support.v7.widget.SearchView {*; } robi. – Ernest

+0

SearchView jest pod pakietem android.support.v7.widget, a nie android.support.v7.app, więc lepiej jest użyć -keep class android.support.v7. ** {*; } –

+0

Istotny problem: https://code.google.com/p/android/issues/detail?id=224967 – BoD

5

I (również) dostał

Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.ao)' on a null object reference 

przy uruchamianiu mój build zwalniający (z PROGUARD/Minify włączone) .

dodanie tego do zasad PROGUARD naprawił:

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

ta będzie utrzymywać widget SearchView ale nadal pozwoli PROGUARD wyrzucić innych klas bibliotecznych wsparcie, których nie używasz, aby zachować Wydań buduj ładnie i porządnie.

27

Dodaj następujący kod do proguard-rules.pro

-keep class android.support.v7.widget.SearchView { *; } 
+4

Awesome! to działało idealnie dla mnie – ziniestro

7

po wielu godzinach badań proste rozwiązanie tego problemu czyli wystarczy dodać

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

w app/PROGUARD android.proguard pliku/z AndroidStudio.

Pozdrawiam!

5

Wymagane minimum do proguard-rules.pro

-keep class android.support.v7.widget.SearchView { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
+0

To rozwiązanie jest nadal aktualne. Ten błąd pojawił się ponownie podczas aktualizacji z 'com.android.tools.build: gradle: 2.2.0' do' com.android.tools.build: gradle: 2.2.2' i tej minimalnej reguły proguardowej. – Carmen

1

Musiałem dodać to i teraz działa gładkie:

-keep class android.support.v7.widget.SearchView { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
-keep interface android.support.v7.widget.SearchView { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
}