Android, Come fare una barra di stato trasparente correttamente

? Sandak @ | Original: StackOverFlow
---

Sto cercando di rendere la barra di stato trasparente su Android 4.4+ Io so come farlo trasparente definendo il mio stile :

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

Ho trovato qui :  http://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 :  Android, Come fare una barra di stato trasparente correttamente

Così ho scoperto 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 con la barra di stato superiore trasparente e sembra ok .. Purtroppo non c'è problema in basso sulla " barra di navigazione " con i tasti di sistema, che è rosso e non trasparente come vorrei :  Android, Come fare una barra di stato trasparente correttamente

Stavo provando tutte le possibili varianti per ottenere risultati di lavoro, ma io non riesco a capire come risolverlo . La mia unica soluzione di lavoro è impostato top padding su 60dp all'elemento radice . Ma questa soluzione è brutto e su dispositivi diversi può apparire diverso e non può funzionare .

Ho trovato alcune applicazioni su Google Play che lavorano Ok con sfondo trasparente, quindi sono curioso di sapere come lo fanno funzionare .

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

---

Top 5 Risposta

1Sandak @

// UPDATE : Ok, questo è abbastanza vecchio risposta . Ora è possibile utilizzare il tema Materiale per gestire questa ed è abbastanza facile . Basta impostare bersaglio api a 21+, utilizzare libreria di supporto, se avete bisogno di creare e tema con tema materiale in cui è possibile specificare direttamente lo stato delle barre di colore

<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>

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

OLD ANSWER:

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

L'elemento principale del layout deve essere RelativeLayout . Che dovrebbe seguire il layout principale come ScrollView o qualsiasi tipo di altri layout, non importa . Alla fine prima di chiudere tag layout relativa segue LinearLayout vuoto che ha fissato lo stesso sfondo come Barra 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 dovete impostare in codice alla stessa altezza layout lineare come la barra di stato è :

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

    private void getStatusBarLayout(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 è la soluzione di lavoro per tutti i diversi tipi di deviceas . Per i dispositivi pre KitKat cui sfondo trasparente non è consentito dovete nascondere il layout lineare .