MenuItemCompat.getActionView gibt immer null zurück

Ich habe gerade die v7 AppCompat Support-Bibliothek implementiert, aber die MenuItemCompat.getActionView immer wieder null in jeder Android-Version, die ich getestet habe (4.2.2, 2.3.4 ….)

Das SearchView wird in der SearchView angezeigt, aber es reagiert nicht auf Berührungsaktionen und erweitert nicht, um seinen EditText zu zeigen und ist wie ein einfaches Symbol.

  • Wie man auf den Wert von edittext in Fragment, die in einem Viewpager ist zugreifen
  • Wie platziere ich Knöpfe über Bild in android?
  • Es ist möglich, diese einfache Form in Android XML zu erstellen?
  • Wie finde ich heraus, welcher Keystore verwendet wurde, um eine App zu unterzeichnen?
  • Wie verstecke man progressbar in Android?
  • Android SQLite Auto Inkrement
  •  @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> 

  • Wie kann ich benutzerdefinierte Schaltflächen in das Layout eines AlertDialogs einfügen?
  • Bestätigen Sie, ob andre asset Eintrag eine Datei oder ein Verzeichnis ist
  • Phonegap android application name erscheint vor dem Splash-Screen
  • Wie kann man den Handler im Code abbrechen?
  • Skalieren Sie Text in einer Ansicht zu passen?
  • Android Studio 2.0 Instant Run verursacht DexFile, um keine Klassen zu laden
  • 10 Solutions collect form web for “MenuItemCompat.getActionView gibt immer null zurück”

    Schließlich fand ich die Lösung.

    1. Ändern des Namensraums von actionViewClass von android:actionViewClass zu app:actionViewClass

    2. Implementierung von android.support.v7.widget.SearchView.OnQueryTextListener Schnittstelle für aktuelle Aktivität.

    3. Verwenden setOnQueryTextListener stattdessen setOnQueryTextListener statt SearchViewCompat.setOnQueryTextListener

       @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) { searchView.setOnQueryTextListener(this); } return super.onCreateOptionsMenu(menu); } 

    In meinem Fall war es ProGuard-Datei. Sie müssen diese Zeile hinzufügen:

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

    Für mich hat ein falscher menu.xml Namespace-Import dieses Problem verursacht.

    Meine ursprüngliche menu.xml :

     <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/tools"> <item android:id="@+id/action_search" android:title="@string/map_option_search" android:icon="@drawable/ic_action_search" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu> 

    Es sieht aus wie die xmlns:app="http://schemas.android.com/tools" verursachte MenuItemCompat.getActionView() , um null . Ändern dieses Importes in xmlns:app="http://schemas.android.com/apk/res-auto" behoben das Problem.

    Neue Arbeitsmenü.xml:

     <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" android:title="@string/map_option_search" android:icon="@drawable/ic_action_search" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="android.support.v7.widget.SearchView"/> </menu> 

    Ich war mit dem gleichen Fehler, meine Methode getActionView() war immer wieder null. Also habe ich folgende Dinge gemacht:

     <item android:id="@+id/action_search" android:icon="@drawable/abc_ic_search" android:title="@string/search_title" android:showAsAction="always" android:actionViewClass="android.widget.SearchView"/> 

    Ich habe in einigen Beiträgen gesehen, dass die Leute app verwenden: oder yourapp, aber ich habe normalerweise android:ActionVewClass .

    Auf meiner onCreateOptionsMenu Methode:

     @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.feed, menu); // Associate searchable configuration with the SearchView SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search) .getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); return true; } 

    Und vergessen Sie nicht, die onCreate Methode onCreate :

     // enabling action bar app icon and behaving it as toggle button getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); 

    Das funktioniert sehr gut für meine Aktivität "Erweiterung" für FragmentActivity und ActionBarActivity .

    Ich denke, dass das Problem ist, dass Sie die SearchView aus dem Support V7-Paket verwenden und vielleicht ist Ihre API-Ebene auf ….. 22 ??.

    Ändern Sie Ihren Code auf die folgenden, um das Problem zu beheben:

    Menu.xml

     <?xml version="1.0" encoding="UTF-8" ?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_search" android:icon="@drawable/actionbar_button_search" android:title="Search" android:showAsAction="always" android:actionViewClass="android.widget.SearchView" /> </menu> 

    Mohsen Afshins Antwort oben war mein Ausgangspunkt und ich machte einige Tweaks, um es mit meinem Setup zu arbeiten:

     @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); SearchView searchView = (SearchView) searchItem.getActionView(); if (searchView != null) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { // do something with s, the entered string query = s; Toast.makeText(getApplicationContext(), "String entered is " + s, Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onQueryTextChange(String s) { return false; } }); } return super.onCreateOptionsMenu(menu); } 

    Menu.xml

     <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" > <item android:id="@+id/action_search" android:orderInCategory="5" android:title="Search" android:icon="@drawable/ic_action_search" android:showAsAction="ifRoom|collapseActionView" android:actionViewClass="android.widget.SearchView" /> </menu> 

    Ich hatte den gleichen Code, aber anstatt den Import zu verwenden android.support.v7.widget.SearchView; Ich war mit import android.widget.SearchView; . Das hat mein Problem mit dem null behoben. Also ändere einfach diesen Code in deiner Suchaktivität und es wird funktionieren und auch den Namensraum in der XML-Datei ändern.

    Hier ist ein Ausschnitt, wie man die searchView von der Support-Bibliothek behandeln kann v7:

     @Override public void onCreateOptionsMenu(final Menu menu,final MenuInflater inflater) { menu.clear(); getActivity().getMenuInflater().inflate(...,menu); _searchView=(SearchView)MenuItemCompat.getActionView(_searchMenuItem); _searchView.setQueryHint(...); if(VERSION.SDK_INT<VERSION_CODES.HONEYCOMB) { final EditText searchTextView=(EditText)searchView.findViewById(R.id.search_src_text); if(searchTextView!=null) { searchTextView.setScroller(new Scroller(_context)); searchTextView.setMaxLines(1); searchTextView.setVerticalScrollBarEnabled(true); searchTextView.setMovementMethod(new ScrollingMovementMethod()); searchTextView.setTextColor(_context.getResources().getColor(App.getResIdFromAttribute(_context,android.R.attr.textColorPrimary))); } } _searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() { ... }); MenuItemCompat.setActionView(_searchMenuItem,_searchView); MenuItemCompat.setOnActionExpandListener(_searchMenuItem,new OnActionExpandListener() { ... }); super.onCreateOptionsMenu(menu,inflater); } public static int getResIdFromAttribute(final Activity activity,final int attr) { if(attr==0) return 0; final TypedValue typedvalueattr=new TypedValue(); activity.getTheme().resolveAttribute(attr,typedvalueattr,true); return typedvalueattr.resourceId; } 

    Auch wenn Sie Proguard verwenden, fügen Sie dies zu seiner Konfiguration hinzu:

     -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } -keep class android.support.v7.widget.SearchView { *; } -keepattributes *Annotation* 

    Ich hatte ein sehr ähnliches Problem mit dem Unterschied, dass ich versuchte, eine Klasse zu verwenden, die android.widget.ImageView erweitert android.widget.ImageView

    Wenn Sie ProGuard verwenden, müssen Sie angeben, um die in dieser Klasse beteiligten Methoden zuzulassen.

     -keep public class * extends android.widget.ImageView{ public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } 

    http://proguard.sourceforge.net/manual/examples.html

    Dies sagt: "Erlaube alle benötigten Konstruktoren, die von xml aufgerufen werden können und erlauben alle benutzerdefinierten Setter, die es auch verwendet (fügen Sie mehr nach Bedarf)"

    Code entfernen: public class DemoActivity erweitert ActionBarActivity

    Ersetzen durch: public class DemoActivity erweitert Aktivität

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.