Appcompat-v7 Araç Çubuğunu Theme.AppCompat.Light.DarkActionBar gibi nasıl biçimlendirebilirim?


105

Theme.AppCompat.Light.DarkActionBarYeni destek kitaplığı Araç Çubuğu ile görünümünü yeniden oluşturmaya çalışıyorum .

Araç çubuğum seçersem Theme.AppCompat.Lightaçık, seçersem Theme.AppCompatkaranlık olur. (Teknik .NoActionBarolarak sürümü kullanmanız gerekir, ancak anlayabildiğim kadarıyla tek fark,

<style name="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Şimdi yok Theme.AppCompat.Light.DarkActionBarama safça kendiminkini yapmak için yeterince iyi olacağını düşündüm

<style name="Theme.AppCompat.Light.DarkActionBar.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Ancak bununla birlikte araç çubuklarım hala Lighttemalıdır. Koyu (temel) temayı ve Açık temayı karıştırmanın farklı kombinasyonlarını denemek için saatler harcadım ancak araç çubukları dışında her şeyde açık arka planlara sahip olmama izin verecek bir kombinasyon bulamıyorum.

AppCompat.Light.DarkActionBarGörünümü ithalatlarla elde etmenin bir yolu var mı android.support.v7.widget.Toolbar?

Yanıtlar:


216

Bir Light.DarkActionBarklon için Araç Çubuğunu biçimlendirmenin önerilen yolu Theme.AppCompat.Light.DarkActionbar, ana / uygulama teması olarak kullanmak ve varsayılan ActionBar'ı gizlemek için stile aşağıdaki nitelikleri eklemektir:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

Ardından, Araç Çubuğunuz olarak aşağıdakileri kullanın:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <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/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>

Ayrıca değişiklikler için, size uzanan stilleri yaratacak ThemeOverlay.AppCompat.Dark.ActionBarve ThemeOverlay.AppCompat.Lightiçinde olanları değiştirerek AppBarLayout->android:themeve Toolbar->app:popupTheme. Ayrıca ?attr/colorPrimary, ana stilinize ayarladıysanız, farklı bir arka plan rengi elde edebilmeniz için bunun sizi alacağını unutmayın.

Bunun güzel bir örneğini Empty ActivityAndroid Studio (1.4+) ile mevcut proje şablonunda bulacaksınız .


1
Peki evet yapabilirsin. "Kendi tanımladığınız stillerden miras almak istiyorsanız, parent niteliğini kullanmak zorunda değilsiniz. Bunun yerine, devralmak istediğiniz stilin adını nokta ile ayırarak yeni stilinizin adına ön ek olarak ekleyin. . " developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal

1
Ayrıca gönderdiğiniz xml'yi kullanarak beyaz metin içeren beyaz bir araç çubuğu alıyorum veya temayı ThemeOverlay.AppCompat.ActionBarsiyah metinli beyaz araç çubuğu olarak değiştirirsem o kadar iyi çalışmıyor gibi görünüyor. Görünüşe göre sistem <item name="android:colorBackground">@color/background_material_dark</item>girişi umursamıyor Base.ThemeOverlay.AppCompat.Dark. Ama kazmaya devam edeceğim. (Ve o sayfayı okudum. Başlangıç ​​noktalarımdan biriydi. Hala işe yaramıyor gibi görünüyor.)
Liminal

1
Bunun için üzgünüm. Basit olması için Araç Çubuğunun arka plan rengini dışarıda bıraktım ve sonuçları test etmedim. Cevabı buna göre revize ettim. Bunu sadece stilleri kullanarak yapmanın bir yolunu bulamadım. Uygulamamın farklı renk şemaları olduğundan, android:background="?attr/colorPrimary"Araç Çubuğunda ve <item name="colorPrimary">@color/background_material_dark</item>kendi tarzımda kullanıyorum, böylece birincil uygulama rengini otomatik olarak uyarlar.
oRRs

1
bu uygulama artık 23 uyumlu uygulamada çalışmıyor ve başlık siyah ve beyaz değil: /
Rashad.Z

21
Bu tema ve stil ormanına hakim olmanın bir yolu var mı?
axd

72

Düzenle: appcompat-v7: 22.1.1'e güncelledikten ve benim styles.xml AppCompatActivityyerine kullanıldıktan ActionBarActivitysonra şöyle görünür:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Not: Bu Toolbar, çerçeve tarafından sağlanan (XML dosyasına dahil DEĞİLDİR) kullandığım anlamına gelir .

Bu benim için çalıştı:
styles.xml dosyası:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Güncelleme: Gabriele Mariotti'nin blogundan bir alıntı .

Yeni Araç Çubuğu ile bir stil ve tema uygulayabilirsiniz. Onlar farklı! Stil, Araç Çubuğu görünümünde yereldir, örneğin arka plan rengi. App: theme bunun yerine, araç çubuğunda şişirilmiş tüm kullanıcı arabirimi öğeleri için geneldir, örneğin başlık ve simgelerin rengi.


"Hata: Verilen adla eşleşen kaynak bulunamadı: attr 'colorPrimary'." Burada appcompat_v7'yi kullanmaktan bahsediyoruz.
Yar

Benim için bu sadece Lollipop cihazlarında çalışıyor. Lolipop öncesi sadece eylem çubuğu değil, tüm aktiviteler karanlık temayı kullanıyor, ki bu istediğim şey değil. Oy verdim, ancak sonunda tek Araç Çubuğu görünümünü şekillendirerek oRRs yanıtını kullandım.
lorenzo-s

@ lorenzo-s Appcompat'ın en son sürümü için cevabımı güncelledim. Ayrıca Android 4.3 ile Galaxy Nexus'ta test ettim ve çalışıyor
LordRaydenMK

31

Tamam, bu soruna çok fazla zaman ayırdıktan sonra, umduğum görünümü elde etmeyi başardım. Her şeyi tek bir yerden alabilmek için bunu ayrı bir cevap veriyorum.

Bu faktörlerin birleşimidir.

İlk olarak, araç çubuklarının sadece temalar aracılığıyla güzelce oynamasını sağlamaya çalışmayın. İmkansız gibi görünüyor.

Öyleyse temaları araç çubuklarınıza oRRs yanıtında olduğu gibi açıkça uygulayın

layout / toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:theme="@style/Dark.Overlay"
    app:popupTheme="@style/Dark.Overlay.LightPopup" />

Ancak bu sihirli sos. Arka plan renklerini gerçekten elde etmek backgroundiçin Araç Çubuğu temalarınızdaki özniteliği geçersiz kılmanızı umuyordum.

değerler / styles.xml:

<!-- 
    I expected android:colorBackground to be what I was looking for but
    it seems you have to override android:background
-->
<style name="Dark.Overlay" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

<style name="Dark.Overlay.LightPopup" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:background">@color/material_grey_200</item>
</style>

daha sonra araç çubuğu düzeninizi diğer düzenlerinize ekleyin

<include android:id="@+id/mytoolbar" layout="@layout/toolbar" />

ve gitmekte fayda var.

Umarım bu başka birine yardımcı olur, böylece bunun için benim kadar zaman harcamanıza gerek kalmaz.

(Biri sadece temaları kullanarak bunun nasıl yapılacağını anlayabilirse, yani temaları mizanpaj dosyalarında açıkça uygulamak zorunda kalmazsa, bunun yerine cevaplarını memnuniyetle destekleyeceğim)

DÜZENLE:

Görünüşe göre daha eksiksiz bir cevap göndermek bir olumsuz oylama mıknatısı idi, bu yüzden yukarıdaki eksik cevabı kabul edeceğim, ancak birinin gerçekten ihtiyacı olması durumunda bu cevabı burada bırakacağım. Yine de sizi mutlu edecekse, olumsuz oy vermeye devam edin.


2
AppTheme'ime , Araç Çubuğu widget'ımda özelliği <item name="colorPrimary">@color/colorPrimary</item> kullanmakta özgürüm android:background="?attr/colorPrimary".
lemuel

"@ Color / material_grey_200" tanımını nasıl elde edeceğinizi öğrenebilir miyim?
Cheok Yan Cheng

Tam olarak nerede olduğunu hatırlamıyorum ama birisi google.com/design/spec/style/color.html#color-color-palette'e dayalı bir colours.xml dosyasını şu anda bulamıyor
Liminal

1
@Liminal Eğer kullanırsanız @android:color/transparent, bir menü öğesine uzun bastığınızda / tıkladığınızda bu sorunu önlersiniz, metnin etrafında bir kutu vardır. Bu aynı zamanda gelecekte açık arka plan renginin değişip değişmediğini de kanıtlar.
Ryan R

CollapsingToolbarLayout kullandığınızda çalışmıyor.
arekolek

17

Bunu yapmanın en temiz yolu ' ThemeOverlay.AppCompat.Dark.ActionBar ' altını oluşturmaktır . Örnekte, Araç Çubuğunun arka plan rengini KIRMIZI ve metnin rengini MAVİ olarak ayarladım.

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#FF0000</item>
    <item name="android:textColorPrimary">#0000FF</item>
</style>

Temanızı araç çubuğuna uygulayabilirsiniz:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:theme="@style/MyToolbar"
    android:minHeight="?attr/actionBarSize"/>

6
Tanrım bu buydu! textColorPrimary! Neden bunu hiçbir yerde bulmak bu kadar zordu
Muppet

12

Araç çubuğu stilini özelleştirmek için, önce Widget.AppCompat.Toolbar'ı devralan araç çubuğu özel stili oluşturun, özellikleri geçersiz kılın ve ardından aşağıda gösterildiği gibi özel uygulama temasına ekleyin, bkz. Http://www.zoftino.com/android-toolbar-tutorial için daha fazla bilgi araç çubuğu ve stilleri.

   <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="toolbarStyle">@style/MyToolBarStyle</item>
    </style>
    <style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">#80deea</item>
        <item name="titleTextAppearance">@style/MyTitleTextAppearance</item>
        <item name="subtitleTextAppearance">@style/MySubTitleTextAppearance</item>
    </style>
    <style name="MyTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="android:textSize">35dp</item>
        <item name="android:textColor">#ff3d00</item>
    </style>
    <style name="MySubTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
        <item name="android:textSize">30dp</item>
        <item name="android:textColor">#1976d2</item>
    </style>

7

Yout bunu aşağıda deneyebilir.

<style name="MyToolbar" parent="Widget.AppCompat.Toolbar">
    <!-- your code here -->
</style>

Ve bunları https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar'da bulabileceğiniz detay öğeleri

Biraz daha var: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle, Widget.AppCompat.Toolbar.Button.Navigation.

Umarım bu size yardımcı olabilir.


1
Evet. Bunlarla arka plan rengini doğru bir şekilde elde edebildim ve sonunda başlık renklerini nasıl doğru bir şekilde alacağımı buldum. Ancak şu anda katil olan şey, taşma düğmesinin rengini nereden aldığını anlayamıyorum. Ne değiştirirsem değiştireyim o kadar karanlık kalıyor ki, karanlık eylem çubuğuma karşı görünmüyor. Temayı karanlığa çevirirsem, o zaman açık ve iyi görünür.Ancak, ne kadar kazarsam da, hafif bir temayla başladığımda taşma simgesinin nasıl açık
görünmesini sağlayacağımı çözemiyorum

0

Arnav Rao'ya benzer, ancak farklı bir ebeveynle:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="toolbarStyle">@style/MyToolbar</item>
</style>

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#ff0000</item>
</style>

Bu yaklaşımla, Araç Çubuğunun görünümü tamamen uygulama stillerinde tanımlanır, bu nedenle her araç çubuğuna herhangi bir stil yerleştirmenize gerek kalmaz.


2
Aslında android:toolbarStyleAPI 21+ android.widget.Toolbar. toolbarStyleiçin AppCompat olduğunu android.support.v7.widget.Toolbar.
Eugen Pechanec

Android Studio'nun bana bir sorun çıkardığını düşünmüştüm, ancak ikinci bir testte haklısın! Bu harika bir haber - minSDK'mi tekrar 19'a indirebildim ve görünen o ki toolbarStyle'ım hala iyi çalışıyor! Teşekkür ederim!
craigmj

Sadece fark ettim! Hala temalara karşı stillerin yanlış anlaşılması var . stil bir temayı genişletmemelidir . MyToolbarWidget.AppCompat.Toolbar
Eugen Pechanec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.