2016-02-20 15 views
5

Wenn ich das Überlaufmenü in meiner Anwendung öffne, sehe ich ein durchgehendes Rechteck der Hintergrundfarbe des Menüs hinter dem Menü selbst während der Eingabe-/Beendigungs-Animationen. Hier ist eine Animation dies zeigt (verlangsamte sich auf 75% Geschwindigkeit):Entfernen Sie zusätzliche Hintergrundfarbe Rechteck von Überlaufmenü betreten/beenden Animationen?

Das Vorhandensein dieses Fremd farbiges Rechteck verdirbt das schöne Eingabe/Exit Animationen! Wie kann ich es unter Beibehaltung aller anderen Toolbar Styling entfernen?


Forschung

ich auf SO eine Reihe von Antworten auf Toolbar Styling gelesen haben, und Chris Banes eigene Beiträge zu diesem Thema. Es scheint, dass sich die Verwendung der Tags auf einer Basis in den letzten paar Jahren geändert hat, was es schwierig gemacht hat, überall endgültige Informationen zu finden.

Ich habe dies mit den Versionen 22.1.0 bis einschließlich 23.2.0 der Support-Bibliothek reproduziert.


App Dateien

styles.xml

<resources> 

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
    </style> 

    <style name="ToolbarStyle" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
     <item name="android:background">@color/colorPrimary</item> 
    </style> 

</resources> 

activity_main.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:style="@style/ToolbarStyle" /> 

    <fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

Runtime anzeigen Analyse

Als @Commonsware suggested, nahm ich einen Blick auf die Ansichtshierarchie zur Laufzeit. Bearbeiten in den Ergebnissen:

Menü zusammenbrach (Überlauf-Taste vorhanden ist, keine geheimnisvolle zusätzliche Rechteck):

View hierarchy diagram when menu is collapsed

Menü erweitert (Überlauf Menü Ansichten in separaten Window angezeigt):

View hierarchy diagram when menu is expanded

Die Hauptanwendungsansicht hie rarchy (wie in der ursprünglichen Window angezeigt) ist unverändert beim Vergleich der beiden Menü (steady) states. Meine Vermutung ist daher, dass das zusätzliche Rechteck vorübergehend während der Menüanimationen dem Hauptanwendungsfenster hinzugefügt und sofort nach deren Fertigstellung entfernt wird. Ich bin mir nicht sicher warum dies wäre getan - vielleicht ist es ein Kater von einer älteren (und jetzt unbenutzten) Methode zum Anzeigen und Verbergen des Überlaufmenüs? Wenn mein Abzug richtig ist, dann könnte diese Frage gelöst werden, wenn wir herausfinden können, wie wir dieses vorübergehende Verhalten verhindern können ...

+1

, der wie ein separates 'View' aussieht. Sie könnten Hierarchie-Viewer oder "uiautomatorviewer" verwenden, um festzustellen, was das ist. – CommonsWare

+0

@CommonsWare hat die Frage bearbeitet, um Informationen zur Laufzeitansichtshierarchie einzubeziehen. – stkent

+0

Hmmm ... Ich hatte erwartet, dass 'View' sich festgefahren hat und einfach hinter dem echten Überlauf versteckt ist. Leider sind Hierarchy View und 'uiautomatorviewer' nur sehr gut in der statischen Analyse. Ich kenne keine Werkzeuge, die einen 'ViewTreeObserver' verwenden, um zu versuchen, diese Dinge dynamisch zu protokollieren, obwohl ich noch nicht mit Stetho gespielt habe und es vielleicht anbieten könnte. – CommonsWare

Antwort

2

Ein Auszug aus der Chris Bane's Antwort auf die Frage AppCompat style background propagated to the Image within the ToolBar

style = lokal auf den Toolbar
Thema = global, um alles in den auf dem obigen Beitrag

Basierend

Toolbar aufgeblasen es scheint Das android:background Attribut, das Sie in dem android:theme festlegen, ist der Grund für die zusätzliche Hintergrundfarbe während der Animation.

Ich würde die background direkt auf toolbar setzen und das Attribut android:colorBackground verwenden, um die Hintergrundfarbe für das Popup festzulegen. Die Animation scheint gut zu funktionieren.

Code:

activity_main.xml

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    android:theme="@style/CustomToolbarTheme" /> 

styles.xml

<style name="CustomToolbarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <item name="android:colorBackground">@color/colorPrimary</item> 
    <item name="android:textColorPrimary">@android:color/white</item> 
</style> 
+0

Ah, gute Verbindung! Hast du vor, 'style' anstatt' android: theme' in 'Toolbar' zu verwenden? – stkent

+0

@stkent Die Verwendung von 'Stil' ist hier optional. Wenn Sie die Symbolleiste wiederverwenden möchten, können Sie die Attribute wie 'background <,' theme', 'popupTheme' usw. zu einem benutzerdefinierten' style' extrahieren und wiederverwenden. – blizzard

+1

Ja, macht Sinn. Ich musste "android: textColorPrimary" nicht im Toolbar-Design angeben (das Dark-Overlay-Theme wurde festgelegt, dass es bereits weiß war). Anders als bei der Verwendung dieser Kombination von Attributen wurde das Problem jedoch behoben. Vielen Dank! – stkent