2017-07-27 117 views
0

在具有可配置主題的應用程序中,如何設置app:popupTheme以匹配整體主題?如何根據應用程序的整體主題更改`app:popupTheme`?

我使用Android Studio的嚮導創建了一個包含導航抽屜的應用程序。然後,我修改了這段代碼,添加了一個複選框,用於在運行時在深色主題和淺色主題之間進行選擇,並在活動上調用setTheme。完整的代碼可以在this github repo中找到。

app/src/main/res/values/styles.xml,Android Studio中生成以下:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/> 

此樣式中app/src/main/res/layout/app_bar_main.xml使用,也由Android Studio生成:

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    app:popupTheme="@style/AppTheme.PopupOverlay"/> 

app:popupTheme屬性確定由所使用的樣式的「 ⋮「菜單。這在使用輕量級主題時看起來很正確,但是當我在運行時將應用程序切換爲黑暗主題時,菜單顏色錯誤。我知道我可以改變AppTheme.PopupOverlay的母公司,是這樣的:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/> 

,使其在黑暗的主題工作,但隨後的菜單看起來錯誤的,當光線主題是積極的。

什麼是正確的方式讓菜單的着色動態適應應用程序的整體主題,無論是黑暗還是光? app:popupTheme應該動態變化嗎? AppTheme.PopupOverlay的父母應該動態變化嗎?還有別的嗎?

回答

1

這可以通過使用定製attr來完成:

  1. 與自定義attr創建app/src/main/res/values/attrs.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <resources> 
    <attr name="popupOverlayStyle" format="reference"/> 
    </resources> 
    
  2. app/src/main/res/values/styles.xml,創建一個黑暗等同於AppTheme.PopupOverlay

    <style name="AppTheme.PopupOverlay.Dark" 
        parent="ThemeOverlay.AppCompat.Dark"/> 
    
  3. 在每個主題中,添加項目設置自定義ATTR到相應的彈出框的形式:

    <!-- in the light AppTheme --> 
    <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay</item> 
    
    <!-- in the dark AppTheme --> 
    <item name="popupOverlayStyle">@style/AppTheme.PopupOverlay.Dark</item> 
    
  4. app/src/main/res/layout/app_bar_main.xml設置app:popupTheme引用自定義attr

    app:popupTheme="?popupOverlayStyle" 
    

更改應用程序的主題將自動調整app:popupTheme引用的樣式。

相關問題