2015-09-10 17 views
7

Mentre le attività di transito uno ad altri, elementi condivisi, che posto sopra lo schermo in nuova attività, barra di navigazione di sovrapposizione, come indicato sulla foto shared elements overlay navigation barelementi condivisi traboccano barra di navigazione in animazione di transizione

Inoltre è possibile vedere questo bug in video view overlay navigation bar

+1

Questo video è privato. :): P –

+0

Penso che tu conosca la risposta prima di pubblicare la domanda. –

+0

Grazie per l'avviso. Ho cambiato l'accesso al video. –

risposta

0

ho trovato, è bug di Android, quando si utilizza

<item name="android:windowDrawsSystemBarBackgrounds">true</item> 

in tema di attività.

Ma è necessario impostare il colore sulla barra di stato, quindi non è stato possibile impostarlo su falso. In caso contrario, è possibile impostare questo flag a runtime via

if (Build.VERSION.SDK_INT >= 21) { 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
} 

Inoltre è possibile cancellare questo flag tramite il metodo Window s' clearFlags.

Quindi cancello questo flag prima di avviare l'animazione di transizione nella seconda attività e aggiungere questo flag dopo la transizione terminata. Ha bisogno di fare solo in attività chiamata.

UPDATE

ho trovato una soluzione migliore. In Android, tutte le viste di elementi condivise si basano sulla vista del decoro. Lo sfondo della barra di navigazione di solito si trova in cima alla vista dell'arredamento. Ma nel tempo di transizione gli elementi condivisi sono più elevati.

E 'possibile aggiungere navigationBarBackground per condividere elementi, che è accessibile da getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground). Per questo è necessario aggiungerlo agli elementi condivisi nell'attività di chiamata e aggiungerlo agli elementi condivisi nell'attività chiamata.

C'è un problema. È necessario attendere quando la vista dello sfondo di navigazione sarà allegata alla vista del decoro. Questo è l'esempio di come risolvere questo problema in onCreate() metodo chiamato attività

ActivityCompat.postponeEnterTransition(this); 
final View decorView = getWindow().getDecorView(); 
decorView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     decorView.removeOnLayoutChangeListener(this); 
     View navigationBarBackground = getWindow().getDecorView().findViewById(android.R.id.navigationBarBackground); 
     if (navigationBarBackground != null) { 
      android.support.v4.view.ViewCompat.setTransitionName(navigationBarBackground, "navigationBg"); 
     } 
     ActivityCompat.startPostponedEnterTransition(MyActivity.this); 
    } 
}); 
+2

Dovresti usare 'Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME' e' Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME' come nomi di transizione mentre usi sfondi personalizzati. – kuelye

0

Se si utilizza transizione SharedElement è possibile disattivare la transizione dell'attività di default, che è una dissolvenza chiamando:

getWindow().setEnterTransition(null); 

Questo sarà anche risolvere il problema quando l'elemento condiviso si trova dietro la barra di stato e si verifica un problema tecnico all'avvio dell'animazione.

2

(1) Disattivare la sovrapposizione impostando
android:windowSharedElementsUseOverlay="false" in XML. Se disabilitato, gli elementi condivisi verranno disegnati come parte della gerarchia della vista Attività chiamata, rendendo impossibile che gli elementi condivisi si sovrappongano accidentalmente alle barre dell'interfaccia utente del sistema.
Purtroppo, la disattivazione di questo comportamento potrebbe anche portare a nuovi problemi ...
Ad esempio, è possibile che le visualizzazioni non condivise in entrambe le attività inizino a ritagliare gli elementi condivisi mentre passano in posizione. Nella maggior parte dei casi è possibile impedire che ciò accada impostando android:cliptoChildren="false" e "android:clipToPadding="false" per ciascun elemento padre dell'elemento condiviso nel file XML, sebbene potrebbe essere necessaria una configurazione aggiuntiva a seconda del caso d'uso specifico.
(2) Aggiungere la barra delle azioni, Barra di stato di sfondo e barra di navigazione di sfondo come ulteriori elementi condivisi
Effettuando elementi delle barre di sistema condivisi, è possibile garantire che sia gli elementi condivisi originali e l'interfaccia utente del sistema sono disegnati a lo stesso livello in cima al resto della gerarchia View della finestra. Per ottenere un riferimento a questi punti di vista, è possibile utilizzare il seguente codice:

View decor = getWindow().getDecorView();
View statusBar = decor.findViewById(android.R.id.statusBarBackground);
View navBar = decor.findViewById(android.R.id.navigationBarBackground);
View actionBar = decor.findViewById(getResources().getIdentifier("action_bar_container", "id", "android"));

è possibile fare riferimento questo per più discussione this post

Problemi correlati