2013-11-02 9 views
35

Durante l'aggiornamento le mie applicazioni per Kitkat, volevo solo dare loro un look meraviglioso sul KitKat utilizzando la proprietà traslucido:Perché non possiamo usare un bar di sistema traslucidi con e ActionBar

bar sistema Translucent

Ora è possibile rendere le barre di sistema parzialmente traslucide con nuovi temi, Theme.Holo.NoActionBar.TranslucentDecor e Theme.Holo.Light.NoActionBar.TranslucentDecor. Abilitando le barre di sistema traslucide, il layout riempirà l'area dietro le barre di sistema, quindi è necessario abilitare [fitsSystemWindows] [4] per la parte del layout che non dovrebbe essere coperta dalle barre di sistema.

La mia unica preoccupazione è che vorrei usare un ActionBar che suona il contrario di quello che Google vuole (sia tema hanno NoActionBar:

Theme.Holo.NoActionBar.TranslucentDecor 
Theme.Holo.Light.NoActionBar.TranslucentDecor 

Come non ho intenzione di utilizzare alcuni hack o trucchi per farlo funzionare, ho solo voluto sapere se ci fosse un modo corretto per raggiungere questo o se questo sarebbe contro linee guida di Google.

enter image description here

risposta

48

è possibile creare il ow n tema con android.R.attr#windowTranslucentStatus impostato su true per ottenere lo stesso effetto senza perdere ActionBar.

Dalla documentazione:

flag che indica se questa finestra richiede una barra di stato traslucido. Corrisponde a a {@link android.view.WindowManager.LayoutParams # FLAG_TRANSLUCENT_STATUS}.

stili - Ricordate, questi sarebbero andati in values-v19.

<style name="TranslucentStatusBar" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:actionBarStyle">@style/TranslucentActionBar</item> 
    <item name="android:windowTranslucentNavigation">false</item> 
    <item name="android:windowTranslucentStatus">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
</style> 

<style name="TranslucentActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> 
    <item name="android:background">@android:color/transparent</item> 
</style> 

layout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_blue_dark" 
    android:fitsSystemWindows="true" > 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/holo_purple" /> 

</FrameLayout> 

Risultati

enter image description here

+1

Questa soluzione ottenere alcuni problemi di sovrascrizione .. Aggiungerà informazioni nei commenti se trovo un modo elegante per risolvere il problema! Grazie per la risposta –

+0

Questo è molto bello. Ma ho riscontrato alcuni problemi con Fragments. Tutte le mie attività sono alla ricerca, ma i miei frammenti occupano molto spazio. Non so perché, perché le attività funzionano bene. –

+0

Esattamente quello che mi serviva !! Ottima soluzione !! – ASP

40

Questo funziona con meno linee:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     Window w = getWindow(); // in Activity's onCreate() for instance 
     w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
     w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
    } 

Sarebbe bello se qualcuno potesse aggiungere, come verificare, se la navigazione traslucida è disponibile, perché N10, ad es. avrà la navigazione traslucida disabilitata con Build.VERSION_CODES.KITKAT. Edit: ha risposto in questa domanda: Check if translucent navigation is available

+3

Il problema sarebbe lo stesso .. come aggiungere lo stesso colore per statusBar di ActionBar –

17

Questa è la risposta che cercavo: https://github.com/jgilfelt/SystemBarTint

Android 4.4 (KitKat) ha introdotto lo stile dell'interfaccia utente del sistema traslucido per lo stato e le barre di navigazione. Questi stili sono ideali per attività basate su wallpaper come il launcher della schermata iniziale, ma la protezione dello sfondo minima fornita da li rende meno utili per altri tipi di attività a meno che non forniate i vostri sfondi personali all'interno del layout. Determinando la dimensione, la posizione e l'esistenza dell'interfaccia utente di sistema per una determinata configurazione di dispositivo possono essere non banali.

Questa libreria offre un modo semplice per creare uno sfondo "tinta" per le barre di sistema , sia esso un valore di colore o Drawable. Di default darà a uno sfondo nero semiopaco che sarà utile per le schermate di contenuto a schermo intero in cui l'interfaccia utente di sistema persistente è ancora importante - come quando posizionata su una mappa o una griglia di foto.

enter image description here

29

Il codice sotto funziona bene nella mia app.

traslucido:

Window w = getWindow(); 
       w.setFlags(
         WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, 
         WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
       w.setFlags(
         WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, 
         WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

Seting non trasparente:

final WindowManager.LayoutParams attrs = getWindow() 
         .getAttributes(); 
       attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
       attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
       getWindow().setAttributes(attrs); 
       getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 
+0

Perché non semplicemente 'getWindow(). ClearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);' per rimuovere la barra di navigazione traslucida? –

4

Tutte le risposte prolungare l'ActionBar livello di programmazione o dal layout: che cosa questo significa è che quando l'applicazione viene lanciata o ha ricreato il il sistema cercherà il tema (che non è a conoscenza della correzione) e mostrerà una barra di stato MOLTO BRUTTA colorata con qualunque sia lo sfondo della finestra ...!

ho creato un esempio di come farlo utilizzando il tema solo:

https://github.com/Takhion/android-extendedactionbar

Spero possa essere utile per qualcuno :)

+1

Grazie !! Questo è un problema che sto cercando di risolvere da molto tempo! siete i benvenuti per rispondere alla mia domanda: http://stackoverflow.com/questions/26402466/how-to-set-status-bar-tint-color-in-layout-style-xml –

Problemi correlati