Android, Como fazer uma barra de status transparente corretamente

? Sandak @ | Original: StackOverFlow
---

Eu estou tentando fazer barra de status transparente sobre Android 4.4+ Eu sei como fazer isso claro, definindo o meu próprio estilo :

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

Encontrei aqui:  http://stackoverflow.com/a/20573595/2633630

O problema é que quando a barra de status é transparente, ele não combinar com a cor da barra de ação e atividade em segundo plano é visto :  Android, Como fazer uma barra de status transparente corretamente

Então eu descobri que eu posso usar android: fitsSystemWindows = "true" e android: clipToPadding = "false" no meu layout que eu encontrei aqui 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"> 
....

Isso resolve o principal problema com a barra de status transparente e parece ok .. Infelizmente não há problema na parte inferior sobre a " barra de navegação " com os botões do sistema, que é vermelho e não transparente como eu desejo :  Android, Como fazer uma barra de status transparente corretamente

Eu estava tentando todas as variantes possíveis para alcançar resultado de trabalho, mas eu não consigo descobrir como resolvê-lo . Minha única solução é trabalhar set top estofamento sobre 60dp para o elemento raiz . Mas essa solução é feio e em diferentes dispositivos pode olhar diferente e pode não estar funcionando.

Encontrei alguns aplicativos no Google Play que trabalham Ok com fundo transparente, por isso estou curioso como eles fazê-lo funcionar .

Por exemplo:  https://play.google.com/store/apps/details?id=com.trello e alguns outros

---

Top 5 Responder

1Sandak @

// UPDATE: Ok, esta é a resposta bastante antiga . Agora você pode usar o tema de Material de lidar com isso e é muito fácil. Basta definir api -alvo para 21+, usar a biblioteca de apoio, se você precisa e criar tema com o tema de material onde você pode especificar o status bar cor diretamente

<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, Parece que eu resolver o meu problema . Ela não é a melhor solução, e mais clara, mas é uma solução de trabalho . Se alguém, no futuro, vai descobrir uma solução melhor e mais clara, por favor, deixe-me saber e eu vou atualizar a minha resposta / ou marcar a sua resposta como correta. Mas, por enquanto, não tenho nenhuma solução melhor do que este pequeno hack :

O elemento raiz do layout tem que ser RelativeLayout . Que deve seguir o seu layout principal como ScrollView ou qualquer tipo de outros layouts, não importa . No final antes de fechar tag layout Relativa segue LinearLayout vazio que estabeleceu o mesmo fundo como sua barra de ação e altura fixa (altura da barra de status ) .

<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, então você tem que definir no código da mesma altura layout Linear como a barra de status tem :

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 depois é só chamar setStatusBarBackground em seu método onCreate (). Esta é a solução de trabalho para todos os diferentes tipos de deviceas . Para dispositivos pré KitKat onde fundo transparente não é permitido que você tem que esconder o layout Linear .