Ho un'attività con uno DrawerLayout
. Il nostro cliente ci richiede di modificare dinamicamente il colore della barra delle azioni e il colore della barra di stato corrispondente di questa attività, in base all'elemento selezionato dallo DrawerLayout
. Questo è fatto facilmente. Tuttavia, il mio problema è che non riesco a mantenere trasparente la barra di stato quando cambio dinamicamente il colore della barra di stato. Quando apro il cassetto, la barra di stato di colore copre la parte superiore della DrawerLayout
in questo modo:Android: barra di stato trasparente con azione dinamicaBar colori e DrawerLayout
Tuttavia, vorrei che la mia DrawerLayout
a guardare come questo:
Questo Posso fare con la seguente riga:
<item name="android:windowTranslucentStatus">true</item>
Howeve r, il mio problema non è che non posso impostare la trasparenza della barra di stato. Il mio problema è che il cambio dinamico della barra di stato e il colore della barra delle azioni non funziona con windowTranslucentStatus
. Il colore della barra di stato rimane colorPrimaryDark
(il colore giallo senape visibile sulla barra di stato nelle immagini sopra) anche dopo che ho chiamato getWindow().setStatusBarColor()
.
Ora, ho seguito il tutorial this e this e this stackoverflow tra molte altre, ma non è stato in grado di risolvere il problema. Tutti questi articoli dicono che lo ActionBar
si sposterà in alto, sotto la barra di stato (in modo che la barra di stato si sovrapponga alla barra delle azioni) dopo aver impostato windowTranslucentStatus
su true
. In seguito, dovrei essere in grado di aggiungere un po 'di padding alla barra delle azioni e semplicemente cambiare il colore della barra delle azioni si tradurrebbe in una barra di stato più scura dello stesso colore poiché la barra di stato è effettivamente traslucida e si sovrappone alla mia barra delle azioni. Tuttavia, per qualche ragione, questo non accade nel mio caso. La barra delle operazioni rimane dov'è se imposto fitsSystemWindows
su true
o false
o rimuovo del tutto l'attributo. La barra delle azioni è sempre sotto la barra di stato che, ovviamente, è sempre gialla se si imposta la trasparenza.
Ho anche provato a impostare un alfa sul colore della barra di stato quando lo si modifica a livello di codice. Questo rende la barra di stato un po 'trasparente, ma sembra strano dato che non è più scuro scuro. Anche la rimozione di CoordinatorLayout
non è di aiuto. Ho passato diverse ore a cercare di risolvere questo problema e ora sono abbastanza frustrato. Qualsiasi aiuto è molto apprezzato.
mio activity_main
:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true">
<include layout="@layout/nav_header_main" />
<android.support.v7.widget.RecyclerView
android:id="@+id/nav_menu_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/nav_header_height"
android:clipToPadding="false"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/size_14dp"
app:layoutManager="LinearLayoutManager" />
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
E qui è la XML per la mia app_bar_main
:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
app:elevation="0dp">
<FrameLayout
android:id="@+id/toolbar_container"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
<com.quintype.sakshipost.Widgets.CustomMaterialSearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
</android.support.design.widget.CoordinatorLayout>
Potrebbe non aver capito completamente la mia domanda. Posso facilmente impostare il colore della barra di stato usando 'getWindow(). SetStatusBarColor (int color);' Non è necessario riavviare l'attività per questo, né chiamare 'setContentView()' più volte. Tuttavia, il mio obiettivo è impostare la barra di stato su _transparent_ e disegnare la barra di azione _underneath_ it. (Inoltre, riavviare un'attività più volte per una questione così banale è un trucco molto poco elegante.) –
O sì, mi sono perso, beh, puoi farlo anche cambiando il tema genitore da ".NoActionBar" a ".Light" che aggiungi una barra delle azioni e puoi impostare il colore anche usando il tema. questo farà tutto ciò che vuoi ma non so come farlo senza riavviare l'applicazione. –
è anche possibile aggiungere una barra di azione personalizzata in modo programmatico mediante una visualizzazione lineare o vista in cui la barra delle azioni sarebbe, e nasconderla e visualizzarla programmaticamente: "View.setVisibility (View.GONE);" "View.setVisibility (View.VISIBLE);" –