2014-05-25 21 views
15

Sto cercando di rendere trasparente la barra di stato su Android 4.4+ So come rendere trasparente attraverso la definizione di un mio stile:Android, Come fare una barra di stato trasparente correttamente

<style name="Theme.MyTheme" parent="Theme.MyTheme.Base"> 
    <item name="android:windowTranslucentStatus">true</item> 
    <item name="android:windowTranslucentNavigation">true</item> </style> 

ho trovato qui : https://stackoverflow.com/a/20573595/2633630

il problema è che quando la barra di stato è trasparente, non corrisponde al colore della barra delle azioni e l'attività in background si vede: transparent status bar error

così ho trovato che posso usare Android: fitsSystemWindows = "true" e Android: clipToPadding = "false" nel mio layout che ho trovato qui http://mindofaandroiddev.wordpress.com/2013/12/28/making-the-status-bar-and-navigation-bar-transparent-with-a-listview-on-android-4-4-kitkat/

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/background_darkRed" 
android:fitsSystemWindows="true" 
android:clipToPadding="false"  
tools:context="com.sandak......."> 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
.... 

che risolve il problema in alto con la barra di stato trasparente e sguardi ok .. Sfortunatamente c'è un problema in basso nella "barra di navigazione" con i pulsanti di sistema, che è rosso e non trasparente come vorrei: enter image description here

Stavo provando tutte le possibili varianti per ottenere risultato di lavoro, ma io non riesco a capire come risolverlo. La mia unica soluzione funzionante è impostare il padding superiore di 60dp all'elemento root. Ma questa soluzione è brutta e su dispositivi diversi può sembrare diversa e potrebbe non funzionare.

Ho trovato alcune applicazioni su Google Play che funzionano bene con sfondo trasparente, quindi sono curioso di sapere come funzionano.

Ad esempio: https://play.google.com/store/apps/details?id=com.trello e pochi altri

+0

Quando ho impostato 'android: windowTranslucentStatus/Navigation' su true come hai fatto tu, gli sfondi sono solo semi-trasparenti. Hai fatto qualcosa di diverso per ottenere quel bel effetto sfumato scuro che hai nei tuoi screenshot? – JMRboosties

risposta

12

// UPDATE:
Ok, questo è la risposta piuttosto vecchia. Ora puoi usare il tema Materiale per gestirlo ed è piuttosto facile. Basta impostare api target 21+, usare libreria di supporto se è necessario e creare tema con il tema materiale in cui è possibile specificare la barra di stato di colore direttamente

<style name="AppTheme" 
     parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- colorPrimary is used for the default action bar background --> 
     <item name="colorPrimary">@color/color_primary</item> 

     <!-- colorPrimaryDark is used for the status bar --> 
     <item name="colorPrimaryDark">@color/color_primary_dark</item> 

     <!-- colorAccent is used as the default value for colorControlActivated 
      which is used to tint widgets --> 
     <item name="colorAccent">@color/accent_orange</item> 
    </style> 

============== ================================================== =======

RISPOSTA VECCHIO:

Ok, sembra che ho risolto il mio problema. Non è la soluzione migliore e più chiara, ma è una soluzione funzionante. Se qualcuno in futuro troverà una soluzione migliore e più chiara, per favore fatemelo sapere e aggiornerò la mia risposta/o contrassegnerò la risposta come corretta. Ma per ora, non ho una soluzione migliore di questo piccolo trucco:

L'elemento radice del layout deve essere RelativeLayout. Di quanto dovrebbe seguire il layout principale come ScrollView o qualsiasi altro tipo di layout, non importa. Alla fine, prima della chiusura del tag Relative Layout segue LinearLayout vuoto che ha impostato lo stesso sfondo della barra delle azioni e altezza fissa (altezza della barra di stato).

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.sandak...."> 
<ScrollView 
    android:fitsSystemWindows="true" 
    android:clipToPadding="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
.... all your main views etc.. 
</ScrollView> 
<LinearLayout 
     android:id="@+id/statusBarBackgroundLinearLayout" 
     android:layout_width="match_parent" 
     android:orientation="horizontal" 
     android:layout_height="30dp" 
     android:background="@color/background_darkRed" 
     android:clickable="false" 
     android:focusable="false"> 
    </LinearLayout> 
</RelativeLayout> 

Ok allora si deve impostare nel codice alla stessa altezza layout lineare come la barra di stato ha:

private void setStatusBarBackground(View rootView) { 
     setStatusBarLayout(rootView); 
     statusBarHeight = getStatusBarHeight(); 
     setStatusBarLayoutHeight(statusBarHeight); 
    } 

    private void setStatusBarLayout(View rootView){ 
     statusBarBackgroundLinearLayout = (LinearLayout) rootView.findViewById(R.id.statusBarBackgroundLinearLayout); 
     if (isPreKitkatDevice()) { 
      hideStatusBarLayout(); 
     } 
    } 

    private int getStatusBarHeight() { 
     int statusBarHeight = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      statusBarHeight = getResources().getDimensionPixelSize(resourceId); 
     } 
     return statusBarHeight; 
    } 

    private boolean isPreKitkatDevice(){ 
     return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT; 
    } 

    private void hideStatusBarLayout(){ 
     statusBarBackgroundLinearLayout.setVisibility(View.INVISIBLE); 
    }   

    private void setStatusBarLayoutHeight(int height){ 
     RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) statusBarBackgroundLinearLayout.getLayoutParams(); 
     layoutParams.height = height; 
    } 

E poi basta chiamare setStatusBarBackground nel metodo onCreate().Questa è una soluzione funzionante per tutti i diversi tipi di devicity. Per i dispositivi pre KitKat in cui non è consentito lo sfondo trasparente, è necessario nascondere il layout lineare.

+2

'getStatusBarLayout (Visualizza v)' con nessun tipo di reso? Puoi cambiare quel nome. :) – Rajkiran