Überlaufmenü in ActionBarSherlock erzwingen

Ich möchte das 4.0+ Überlaufmenü auf Pre-ICS-Geräten (2.3 – 2.1) verwendet werden. Ich verwende HoloEverywhere mit ActionBarSherlock.

Ich habe folgende Lösung versucht:

ActionBarSherlock & HoloEverywhere – Überlauf erzwingen?

aber es funktioniert nicht, weil absForceOverflow nicht existiert. War es in der neuesten Version oder etwas entfernt? Ich habe die R Dateien von ABS- und HE-Bibliotheksprojekten überprüft und das Feld ist einfach nicht da.

Das @style/Holo.Theme.Sherlock.Light meiner App ist auf @style/Holo.Theme.Sherlock.Light und das ist das Thema, von dem ich versuchte zu erben und den absForceOverflow Parametersatz auf true .

    Wenn Sie Version 4.2.0 verwenden, wurden .ForceOverflow Designs tatsächlich entfernt.

    Quelle: Version 4.2.0 Änderungsprotokoll

    Auszug aus dem Änderungsprotokoll:

     Add SearchView widget for standard search interaction (API 8+ only) Fix: ShareActionProvider in the split action bar no longer fills the entire screen. Fix: ShareActionProvider now does file I/O on a background thread. Fix: Automatically correct ColorDrawable not respecting bounds when used as a stacked background. Fix: Ensure fragments collection is present before dispatching events. Fix: XML-defined onClick searches the correct context for the declared method. Fix: Ensure action mode start/finish callbacks are invoked on the activity for the native action bar. Fix: Allow tab callbacks to have a fragment transaction instance for any FragmentActivity. Fix: Ensure CollapsibleActionView callbacks are dispatched in both native and compatbility action bars. Fix: Remove .ForceOverflow themes. These never should have been included. 

    Wenn Sie Overflow unbedingt erzwingen müssen, müssen Sie eine frühere Version von ABS herunterladen. Sie können eine Liste des Downloads gemäß ihrem Veröffentlichungsverlauf hier abrufen : http://actionbarsherlock.com/download.html

    Ich persönlich benutze immer noch die ABS Version 4.1.0, da ich momentan keine Änderungen in meiner App vornehmen möchte. Ich benutze das auch in meiner theme.xml :

       

    Und während ich ein Thema für eine Activity in der manifest.xml "@style/Theme.SociallyYOU" , verwende ich dies als Attribut: "@style/Theme.SociallyYOU"

    Wenn Sie den Überlauf unbedingt erzwingen müssen, sollten Sie auch den Gedanken von CommonsWare in einer anderen Frage lesen: https://stackoverflow.com/a/12872537/450534 .

    HINWEIS: Es ist immer besser, die neueste Version zu verwenden, wenn die Kompromisse nicht kritisch sind. Indem ich poste, wie ich das Überlaufmenü erzwinge, empfehle ich weder, dass Sie eine ältere Version verwenden, noch empfehle ich das. Es informiert Sie lediglich über die Möglichkeiten.

    Ab ActionbarSherlock 4.2 haben wir die Fähigkeit verloren, die Sichtbarkeit von Überlaufmenüs zu verwalten. Um es zum Laufen zu bringen, müssen Sie zwei Ansätze kombinieren:

    1. Um die Menü-Sichtbarkeit für Android 3.x (Waben) und höher zu erzwingen, müssen Sie diesen Hack + Add-Check verwenden Android-Version:

       public static final int DEVICE_VERSION = Build.VERSION.SDK_INT; public static final int DEVICE_HONEYCOMB = Build.VERSION_CODES.HONEYCOMB; if (DEVICE_VERSION >= DEVICE_HONEYCOMB) // Code from answer above 
    2. Menü für Pre-Waben-Geräte öffnen:

      • Öffnen Sie ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java , gehen Sie zur Methode reserveOverflow
      • Ersetzen Sie das Original durch:

        public static boolean reserveOverflow (Kontextkontext) {return true; }

      Dies wird dazu führen, Menü zeigt …

      • aber wenn Sie auf Menü klicken, wird das Popup Menü nicht angezeigt. Um dies zu erreichen, müssen wir dies in Ihrer Aktivitätsklasse überschreiben:

         @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (DEVICE_VERSION < DEVICE_HONEYCOMB) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_MENU) { openOptionsMenu(); return true; } } return super.onKeyUp(keyCode, event); } 

    Nach diesen Aktionen sollten Sie absolut funktionierende Overflow-Aktionsleiste für alle Android-Versionen haben.

    Wie Siddharth Lele hervorgehoben hat, wurde es in der letzten ABS-Version entfernt, um sich so zu verhalten wie die eigentliche Aktionsleiste. Auf den ersten Blick ist es also die beste Option, dieses Menü aufzugeben.

    Allerdings ist das Überlaufmenü, das auf dem Bildschirm für einige Geräte angezeigt wird und nicht für andere angezeigt wird, meiner Meinung nach ein großer Designerrors in der Android-Aktionsleiste. Hier ist der Grund:

    Bei Geräten mit einer Hardware-Menütaste wird das Menü nicht in der Aktionsleiste angezeigt. Die Tendenz bei den meisten aktuellen Geräten besteht darin, die Anzahl der HW-Tasten auf ein Minimum zu reduzieren, da es als benutzerfreundlicher angesehen wird (und weil iPhones nur eine Taste haben, so dass sie dieses Design kopieren). Andere Hersteller enthalten die Menü-Taste, aber es ist versteckt, es sei denn, Sie drücken es (ja, es leuchtet, wenn Sie nicht mehr das Licht brauchen. Nicht ein kluges Design, aber wieder, wenn alle Tasten aus dem Telefon sind, sieht mehr iphonish).

    Um dies besser zu verstehen, sehen wir uns ein Beispiel an: Benutzer A hat ein Gerät mit Menü-Taste. Er benutzt seinen bevorzugten Mail-Client. Die Optionen zum Konfigurieren von E-Mail-Accounts werden zusammen mit den üblichen Optionen (Hilfe, Info, usw.) im Überlaufmenü angezeigt. Er möchte ein zweites Konto hinzufügen, aber er hat keine Ahnung, wie man zu diesem Menü kommt. Es gibt keine Informationen auf dem Bildschirm, um ihm zu zeigen, was zu tun ist. So fragt Benutzer A seinen Freund B , der auch diesen Mail-Client benutzt. Benutzer B hat das neueste Nexus N + 1 Googletelefon, und er kann das Überlaufsymbol in der Aktionsleiste anzeigen, da sein Gerät keine HW-Menütaste besitzt. Er zeigt A wie er ein zweites Konto hinzufügen kann, indem er dieses Menü öffnet. Benutzer A ist jetzt völlig verwirrt, da sie die gleichen App-Versionen verwenden. Frustriert, A könnte denken, das Problem ist in seinem Telefon für zu alt zu sein. B ist auch verwirrt.

    An diesem Punkt denken Sie vielleicht, dass sowohl A als auch B Idiot sind, der sich nicht vorstellen kann, wie man ein Smartphone benutzt. Im Gegensatz zu Desktop-Apps kennen jedoch die meisten Smartphone-Nutzer die Grundlagen ihrer Geräte nicht. Ihr vorheriges Telefon könnte ein Tastaturgerät mit einer einfachen Firmware gewesen sein. Die Batterie starb und sie gingen in den Laden für einen Ersatz, aber es war nicht auf Lager. Sie könnten einen im Internet bestellt haben, aber es war teurer als der Kauf eines neueren Telefons. Also wurden sie mit einem Touchscreen-fähigen Telefon verkauft, weil Telefone heutzutage so sind. Jetzt müssen sie sich einem kleinen Computer mit einem vollwertigen Betriebssystem stellen. Um die Dinge noch schlimmer zu machen, kommt das Telefon nur mit einer “Kurzanleitung”, und um das vollständige Handbuch zu bekommen, müssen sie ein PDF aus dem Internet herunterladen. Erraten Sie, was? Sie werden nicht.

    Wenn Sie eine mobile App entwickeln, sollten Sie davon ausgehen, dass der Benutzer nichts über Computer, das Betriebssystem oder ähnliche Apps weiß. Sie sollten die GUI auf allen Geräten ähnlich aussehen lassen, sodass die Benutzer lernen und sich daran erinnern können, wie sie verwendet wird. Machen Sie den Entwicklern der Action Bar keine Vorwürfe: Wenn Benutzer wie A oder B nicht wissen, wie sie zum Optionsmenü gehen sollen, ist das in erster Linie Ihre Schuld . Aus diesem Grund sollten Sie eine Möglichkeit haben, immer auf den Bildschirm Optionen zu gelangen.

    Etwas Ähnliches passiert mit der Zurück-Taste. Einige Geräte verfügen möglicherweise über einen HW-Rückschlüssel, neuere dagegen meist nicht. Aber wann immer wir in unsere Apps zurückkehren können, zeigen wir immer den Pfeil in der Aktionsleiste an, richtig? Und ja, ich weiß, dass ein Knopf zurück in den “Navigationsbaum” navigiert, während der andere “zurück in die Zeit” geht, aber das ist auch ein weiterer Konstruktionserrors: Für den durchschnittlichen Benutzer ist der Rücken einfach zurück. Er hat diese Schaltfläche auf dem Bildschirm und er kann auch die HW verwenden, aber das ist optional. Das sollte auch mit dem Überlaufmenü geschehen.

    Wenn Sie also denken (wie ich), dass dies ein wichtiger Knopf ist, geben Sie nicht auf. Stellen Sie ein reguläres Hauptmenü zur Verfügung und füllen Sie es mit den entsprechenden Untermenüs. Machen Sie es zu einer Aktionsschaltfläche und weisen Sie ihr ein beschreibendes Symbol oder sogar eine Textbeschreibung wie “MENÜ” zu. Sie können auch das Symbol für das Überlaufmenü nachahmen, verwenden Sie einfach eines dieser Zeichenfelder:

      // For ActionBarSherlock abs__ic_menu_moreoverflow_normal_holo_dark.png abs__ic_menu_moreoverflow_normal_holo_light.png // For ActionBar ic_menu_moreoverflow_normal_holo_light.png ic_menu_moreoverflow_normal_holo_dark.png 

    Außerdem: gehe und kopiere die Bilder in deinen Projektordner. Sie können nie wissen, ob zukünftige Versionen von ABS oder die nächste Implementierung von ActionBar sie enthalten werden.

    Ich finde, dass die Antwort von Exterminator13 auf einigen Android-Geräten nicht funktioniert (die Gesamtzahl ist meiner Meinung nach ziemlich klein), aber um so viele Geräte wie möglich zu verwenden, verwende ich einen Dialog und verwende ein Menü mit Android: showAsAction = “always” als Überlaufmenü-Knopf. Schließlich wird der Effekt des Überlaufmenüs von actionbarsherlock durch seine Quelle realisiert, also warum nicht den Effekt durch unser Selbst erkennen, wenn es nicht so störend ist. Wenn Sie Chinesisch verstehen, können Sie auch meinen Blog sehen .

     < ?xml version="1.0" encoding="utf-8"?>    

     private Dialog popupDialog; private Boolean popupState=false; public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: this.finish(); return true; case R.id.more: if (!popupState) { showPop(); }else { popupDialog.dismiss(); } default: return super.onOptionsItemSelected(item); } } private void showPop(){ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(ResID, null); ListView listView = (ListView) view.findViewById(ResID); listView.setAdapter(yourOwnAdapter); popupDialog = new Dialog(WifiAuthWireActivity.this); popupDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); popupDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); popupDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); popupDialog.setContentView(view); // Calculate ActionBar height TypedValue tv = new TypedValue(); ActionBar maActionBar=getSupportActionBar(); int actionBarHeight=maActionBar.getHeight(); if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } WindowManager.LayoutParams wmlp = popupDialog.getWindow().getAttributes(); wmlp.gravity = Gravity.TOP | Gravity.RIGHT; wmlp.x+=12; wmlp.y+=actionBarHeight; popupDialog.getWindow().setAttributes(wmlp); popupDialog.show(); }