Właśnie zaimplementowałem v7 AppCompat
bibliotekę wsparcia, ale MenuItemCompat.getActionView
zawsze zwraca wartość null w każdej testowanej wersji Androida (4.2.2, 2.3.4 ....)
SearchView
Jest wyświetlany w pasku akcji, ale nie reaguje na dotyk działania i nie rozwinie się, pokazując jej EditText
i jest niczym prostym ikony.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
if (searchView != null) {
SearchViewCompat.setOnQueryTextListener(searchView, mOnQueryTextListener);
searchView.setIconifiedByDefault(false);
Log.d(TAG,"SearchView not null");
} else
Log.d(TAG, "SearchView is null");
}
return super.onCreateOptionsMenu(menu);
}
Menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
app:showAsAction="always|collapseActionView"
android:icon="@drawable/abc_ic_search"
android:title="@string/action_bar_search"
android:actionViewClass="android.support.v7.widget.SearchView"/>
<item android:id="@+id/action_refresh"
android:icon="@drawable/refresh"
android:title="@string/action_bar_refresh"
app:showAsAction="ifRoom"/>
</menu>
android
searchview
android-actionbar-compat
android-search
Mohsen Afshin
źródło
źródło
android.support.v7.widget.SearchView
klasy nie należy mylić z klasą „android.support.v4.widget.SearchViewCompat” (która jest znana jako częsty błąd podczas korzystania z biblioteki ActionBarCompat)<menu xmlns:app="http://schemas.android.com/apk/res/android" >
ale pojawia się błądAttribute is missing the Android namespace prefix
. Czy to rozumiesz i jak to naprawić?W moim przypadku był to plik ProGuard. Musisz dodać tę linię:
źródło
U mnie
menu.xml
ten problem spowodował nieprawidłowy import przestrzeni nazw.Mój oryginał
menu.xml
:Wygląda na
xmlns:app="http://schemas.android.com/tools"
to, żeMenuItemCompat.getActionView()
powracałnull
. Zmiana tego importu w celuxmlns:app="http://schemas.android.com/apk/res-auto"
rozwiązania problemu.Nowa praca
menu.xml
:źródło
Myślę, że problem polega na tym, że używasz SearchView z pakietu Support V7 i być może Twój poziom API jest ustawiony na ..... 22 ??.
Zmień kod na następujący w celu rozwiązania problemu:
menu.xml
źródło
Wystąpił ten sam błąd, moja metoda
getActionView()
zawsze zwracała wartość null. Zrobiłem więc następujące rzeczy:Widziałem w niektórych postach, że ludzie używają app: lub yourapp, ale ja używałem normalnie
android:ActionVewClass
.Na mojej
onCreateOptionsMenu
metodzie:I nie zapomnij wprowadzić
onCreate
metody:Działa to bardzo dobrze w przypadku mojej działalności „rozszerzającej” dla
FragmentActivity
iActionBarActivity
.źródło
Powyższa odpowiedź Mohsena Afshina była moim punktem wyjścia i wprowadziłem kilka poprawek, aby działała z moją konfiguracją:
menu.xml
źródło
Miałem ten sam kod, ale zamiast korzystać z importu, którego
android.support.v7.widget.SearchView;
użyłemimport android.widget.SearchView;
. To rozwiązało mój problem znull
wartością. Po prostu zmień ten kod w swojej działalności wyszukiwania, a zadziała, a także zmieni przestrzeń nazw w pliku xml.źródło
Oto krótki opis sposobu obsługi searchView z biblioteki pomocy technicznej w wersji 7:
Ponadto, jeśli używasz Proguard, dodaj to do jego konfiguracji:
źródło
Miałem bardzo podobny problem z tą różnicą, że próbowałem użyć rozszerzonej klasy
android.widget.ImageView
Jeśli używasz ProGuard, musisz określić, czy zezwalają na metody związane z tą klasą.
http://proguard.sourceforge.net/manual/examples.html
To mówi: „Zezwalaj na wszystkie potrzebne konstruktory, które mogą być wywoływane z xml i zezwalaj na dowolne niestandardowe ustawiacze, których używa (dodaj więcej w razie potrzeby)”
źródło
Zrobiłem to ręcznie ustawioną w kodzie java:
Plik układu:
Następnie w kodzie java:
źródło
Usuń kod: klasa publiczna DemoActivity rozszerza ActionBarActivity
Zastąp przez: publiczna klasa DemoActivity rozszerza Activity
źródło