2016-02-20 55 views
5

Quando apro il menu di overflow nella mia applicazione, vedo un rettangolo pieno del colore di sfondo del menu visualizzato dietro il menu stesso attraverso le animazioni di inserimento/uscita. Ecco un'animazione che mostra questo (rallentato a velocità 75%):Rimuovere il rettangolo di colore di sfondo extra dal menu di overflow per entrare/uscire dalle animazioni?

la presenza di questo estranei spoglie rettangolo colorato la bella entrare animazioni/uscita! Come posso rimuoverlo mantenendo tutti gli altri stili Toolbar?


ricerca

Ho letto un sacco di risposte sul Toolbar styling su SO, e Chris Banes' propri post sull'argomento. Sembra che l'utilizzo dei tag style/theme su una base per-View sia cambiato negli ultimi due anni, il che ha reso difficile la ricerca di informazioni definitive ovunque.

L'ho riprodotto usando le versioni dalla 22.1.0 alla 23.2.0 (compresa) della libreria di supporto.


file App

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 Visualizza l'analisi

Come @Commonsware suggested, ho preso uno sguardo alla gerarchia della vista in fase di esecuzione. Modifica dei risultati:

menu ridotto (pulsante presente troppo pieno, senza misterioso rettangolo aggiuntivo):

View hierarchy diagram when menu is collapsed

menu espanso (vista menu di overflow visualizzati in separato Window):

View hierarchy diagram when menu is expanded

La vista dell'applicazione principale hie rarchy (come visualizzato nell'originale Window) è invariato quando si confrontano i due stati del menu (fisso). La mia ipotesi è quindi che il rettangolo extra venga temporaneamente aggiunto alla finestra dell'applicazione principale durante le animazioni del menu e immediatamente rimosso al loro completamento. Non sono sicuro che sia perché questo sarebbe fatto - forse è un postumo di un vecchio (e ora inutilizzato) metodo di mostrare e nascondere il menu di overflow? Se la mia deduzione è corretta, allora questa domanda potrebbe essere risolta se possiamo determinare come prevenire questo comportamento transitorio ...

+1

Che assomiglia a una separata 'View'. È possibile utilizzare Hierarchy Viewer o 'uiautomatorviewer' per determinare di cosa si tratta. – CommonsWare

+0

@CommonsWare ha modificato la domanda per includere le informazioni sulla gerarchia della vista di runtime. – stkent

+0

Hmmm ... Mi aspettavo che 'View' si fosse bloccato e semplicemente nascosto dietro il vero overflow. Sfortunatamente, Hierarchy View e 'uiautomatorviewer' sono veramente bravi nell'analisi statica. Non sono a conoscenza di alcun tool che usi un 'ViewTreeObserver' per provare a fare il logging dinamico di questa roba, anche se non ho ancora giocato con Stetho e potrebbe offrirlo. – CommonsWare

risposta

2

Un estratto dalla risposta Chris Bane's alla domanda AppCompat style background propagated to the Image within the ToolBar

style = locale per la barra degli strumenti
theme = globale a tutto ciò gonfiata nella barra degli strumenti

Sulla base del post di cui sopra sembra , l'attributo android:background che si sta impostando in android:theme è il motivo del colore di sfondo extra durante l'animazione.

Avrei impostato lotoolbar direttamente e utilizzato l'attributo android:colorBackground per impostare il colore di sfondo per il popup. L'animazione sembra funzionare bene.

Codice:

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, buon collegamento! Volevi usare 'style' piuttosto che' android: theme' nel 'Toolbar' xml? – stkent

+0

@stkent L'uso di 'style' qui è facoltativo. Se si desidera riutilizzare la barra degli strumenti, è possibile estrarre gli attributi come 'background,' theme', 'popupTheme' ecc. In uno' stile 'personalizzato e riutilizzarlo. – blizzard

+1

Sì, ha senso. Non avevo bisogno di specificare 'android: textColorPrimary' nel tema della barra degli strumenti (impostando il tema di overlay scuro significava che era già bianco) ma a parte questo usando questa combinazione di attributi verbatim risolto il problema. Grazie! – stkent